我是android新手,请停下来。
这是一个非常简单的场景,有一个操作栏,当一个选项卡被选中时,我需要发送一个 http 请求来获取一个文章列表,当响应到达时,更新一个列表视图,这就是我得到这个异常的地方。
我知道我应该将网络操作与 UI 线程隔离开来,因此我在 AsyncTask 类中实现了网络功能。
最奇怪的是,在我尝试获取文章列表之前,我实际上已经调用了一次网络函数来登录,并且运行良好,没有任何异常!猜猜看,如果我用登录调用替换获取文章列表调用,它也可以正常工作。所有的代码都是一样的,只是参数不同。
我是这样做的,因为太多的模块会使用网络模块,所以我使用静态包装器:
UI -> 静态工厂 -> 新建 AsyncTask -> 响应到达 -> 在静态工厂中调用静态回调函数 -> 在 UI 中调用回调函数
AsyncTask doInBackground
@Override
protected HttpResponse doInBackground(String... params) {
    // TODO Auto-generated method stub
    String uri = params[0];
    HttpGet get = new HttpGet(uri);
    try {
        return _client.execute(get);
    }
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }   
}
AsyncTask 后执行
    @Override
    protected void onPostExecute(HttpResponse result) {
        //Do something with result
        if (result != null) {
            try {
                JSONObject json = FormJsonFromResponse();
                Command.OnTaskComplete(json);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
静态包装代码:
@Override
    public static void OnTaskComplete(JSONObject json) {
        // TODO Auto-generated method stub
        if(_callback != null) {
            _callback.OnCommandComplete(json);
        }
    }
这是我在静态包装器中调用 asynctask 的方式:
public static void LogIn(String user, String pass) {
    new NetworkTask().execute(_uriPrefix + login, _user, _pass);
}