[lottery] 01_购彩大厅(一)——异步获取彩种当前销售期信息

Android 4.0

购彩大厅(一)——异步获取彩种当前销售期信息

第四步:异步获取彩种当前销售期信息
①创建Thread实例执行耗时工作
②创建AsyncTask实例制定耗时工作
③分析存在问题:
多个界面均会使用到AsyncTask实例
每次访问网络时都需要判断当前网络情况
④在BaseView中设置AsyncTask的子类,用于完成与服务器交换的耗时工作
⑤编写executeProxy用于替代execute,在该方法中增加用于判断当前网络的功能
⑥在onPostExecute方法中调用界面更新的方法
1、HallView.java
/**
     * 获取当前销售期信息
     */
    public void getCurrentIssueInfo(){
        // 优化3:使用已有AsyncTask类进行数据的获取,将其丢到BaseView中
        new MyHttpAsyncTask<Integer>() {
            @Override
            protected Message doInBackground(Integer... params) {
                // 1、获取业务的对象(用工厂类来获取)
                CommonInfoEngine infoEngine = EngineFactory.getEngineImplInstance(CommonInfoEngine.class);
                // 2、执行相应的方法
                Message message = infoEngine.getCurrentIssueInfo(params[0]);
                return message;
            }
        }.executeProxy(ConstantValue.SSQ);
        // 2、优化后,在每次调用start()方法时就进行网络的判断
        // new MyThread().start();
        // 1、判断网络类型(有一个问题:每次都需要些这么一大串代码)
        // if (NetUtil.checkNetwork(context)) {// 有网络连接
        // new MyThread().start();
        // } else {// 没有网络连接,提示用户没有网络
        // PromptManager.showNoNetWork(context);
        // }
    }
    
    /**
     * 子线程去获取数据,获取当前销售期信息
     * 
     * @author hacket
     */
    // private class MyThread extends Thread {
    // @Override
    // public void run() {
    // }
    // @Override
    // public synchronized void start() {
    // if (NetUtil.checkNetwork(context)) {// 有网络连接
    // super.start();
    // } else {// 没有网络连接,提示用户没有网络
    // PromptManager.showNoNetWork(context);
    // }
    // }
    // }
2、BaseView.java
/**
 * 访问网络
 * 
 * @author hacket
 * @param <Params>
 */
// 对于不同的请求,Params参数不一样;返回为服务器返回的xml,可以确定为Message
public abstract class MyHttpAsyncTask<Params> extends AsyncTask<Params, Void, Message> {
    
    // 1、由于doInBackground是具体的请求服务,所以要让子类实现,所以将该类做成abstract
    // 2、为了在其execute的时候,可以增加网络状态的判断,所以考虑复写execute()方法
    // 3、而查看源码后可以发现,execute()方法为final,不能被复写
    // 4、所以我们可以将其源码拷贝过来,自己定义一个方法,增加网络判断的功能,调用时就调用这个增强的方法
    /**
     * @param params
     * @return
     */
    public final AsyncTask<Params, Void, Message> executeProxy(Params... params) {
        if (NetUtil.checkNetwork(context)) {// 有网络
            return execute(params);
        } else {// 没有网络
            PromptManager.showNoNetWork(context);
        }
        return null;
    }