您的位置:首页 > 移动开发 > Android开发

安卓我的课表

2016-03-14 19:13 671 查看
开学了,发现课程格子以及本校的XX助手不能使用了,只好自己简单实现了一个安卓的课表,虽然没有华丽的布局,没有清晰的周次,没有考试信息,但是总算知道上什么课以及在哪上课了。

首先,我是第一次做安卓的项目,之前只是搭建过一次环境,用了一个上午去网上找有关课表软件的代码,结果并不多,只是找到了一些教务处网站抓取课表的方法。过了一个上午依然毫无头绪,不知道从何写起。下午理了理思路,决定先写一个登陆教务处的功能,用的AsyncHttpClient,网上找的一个包Android-async-http-1.4.9,重新生成httpunit类,添加了post和get方法

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.myclass;

import org.apache.http.Header;

import android.app.ProgressDialog;
import android.content.Context;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class HttpUtil {
private static AsyncHttpClient client = new AsyncHttpClient();

//静态初始化
static{
client.setTimeout(10000); //设置请求等待时间
}
public static void post(String urlString, RequestParams params, AsyncHttpResponseHandler res) //参数:目标地址,参数列表,返回数据
{
client.post(urlString, params, res);
}
public static void get(String urlString, AsyncHttpResponseHandler res)
{
client.get(urlString, res);
}

}
</span>

然后利用抓包工具查看了登陆教务处的post数据,还好我校教务处没有验证码以及各种奇怪的数据,只有用户名和密码,加入参数列表,调用post
<span style="font-family:KaiTi_GB2312;font-size:18px;">HttpUtil.post(urlAPI, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, cz.msebera.android.httpclient.Header[] arg1, byte[] arg2) {
// TODO 自动生成的方法存根
try{
String resultContent = new String(arg2, "gb2312");
if(isLogin(resultContent))
{
Log.d("TAG", "login success");
SharedPreferences mySharedPreferences = getSharedPreferences("class", MODE_PRIVATE); //打开本地数据文件
SharedPreferences.Editor editor = mySharedPreferences.edit(); //设置编辑器
editor.putString("isLogin", "1"); //添加登录标志
Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
jumpToClassActivity();
editor.commit();
}
else
{
Toast.makeText(getApplicationContext(), "用户名或者密码错误", Toast.LENGTH_SHORT).show();
}
}catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
}

@Override
public void onFailure(int arg0, cz.msebera.android.httpclient.Header[] arg1, byte[] arg2, Throwable arg3) {
// TODO 自动生成的方法存根
Toast.makeText(getApplicationContext(), "连接失败", Toast.LENGTH_SHORT).show();
}

});</span>

用自己手机调试,输入用户名和密码之后好久一直没反应,后来发现原来是我把post的时间设置的太长了,并且没有等到十秒就结束了进程,而且本校教务处用外网是登不上的,后来用校内无线网才登上。这里又有一个问题,本校教务处网站的html代码实在晦涩,而且post的返回数据只有一个框架,判断是否登录成功的代码就是判断是否存在一个表格框架。
<span style="font-family:KaiTi_GB2312;font-size:18px;">public boolean isLogin(String resultContent)
{
Document doc = Jsoup.parse(resultContent, "UTF-8");
Elements elements = doc.select("frameset");
if(elements.isEmpty())
{
return false;
}
else
{
return true;
}
}</span>

第一天结束。
第二天,教务处网站获取课表,get方法,并且是无参数的get方法

<span style="font-family:KaiTi_GB2312;font-size:18px;">public void getClass(View view){
HttpUtil.get(url, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
// TODO 自动生成的方法存根
try {
String result = new String(arg2, "gb2312");
setClass(result);
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
// TODO 自动生成的方法存根

}
});</span>

由于本人自己使用,所以就少写了很多函数,布局也是简单的设置了20个textview,每次获取到一节课的信息就写进textview。
最后一点,保存登录状态以及课表信息。用的SharedPreference,在本地创建一个类似xml的文件,每次向其中添加结点以及获取结点的值,我设置了一个是否登录的标志以及每节课的信息,都保存在了文件里,每次打开程序先检查是否登录,若已经登录转到课表界面,打开课表界面的时候先检查是否保存了课表,若有就直接显示。最后还少一个注销的功能,需要再post一下教务处网站,然后清除本地文件的内容。由于本人需要的功能都已经实现,所以注销也就没写。。。。

所添加的包:,一个是用来对html语言进行操作的,获取其中的结点和结点内容什么的,一个是发起异步http请求,一个就是所依赖的包。

布局很烂,仅限个人使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 课表