安卓我的课表

来源:互联网 发布:ubuntu 16.04 ip设置 编辑:程序博客网 时间:2024/05/01 13:22

开学了,发现课程格子以及本校的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 {privatestatic 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() {@Overridepublic 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();}}@Overridepublic 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() {@Overridepublic 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();}}@Overridepublic void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {// TODO 自动生成的方法存根}});</span>

由于本人自己使用,所以就少写了很多函数,布局也是简单的设置了20个textview,每次获取到一节课的信息就写进textview。

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

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

布局很烂,仅限个人使用。

0 0