奇怪的NetworkOnMainThreadexception

时间:2012-12-27 00:30:41

标签: android

我是android的新手,请停下来。

这是一个非常简单的场景,有一个操作栏,当选择一个标签时,我需要发送一个http请求来获取文章列表,当响应到达时,更新列表视图,这里是我得到此异常的地方。

我知道我应该将网络操作与UI线程隔离开来,所以我在AsyncTask类中实现网络功能。

最奇怪的部分是,在我尝试获取文章列表之前,我实际上已经调用了一次网络功能来登录,这只是工作正常,没有例外!猜猜看,如果我用登录电话替换获取文章列表调用,它也可以正常工作。除了参数不同之外,所有代码都是相同的。

我是这样做的,因为有太多的模块会使用网络模块,我使用静态包装器:

用户界面 - >静电厂 - >新的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 post execute

    @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);
}

1 个答案:

答案 0 :(得分:1)

按照以下模式修改AsyncTask:

@Override
protected JSONObject doInBackground(String... params) {
    // TODO Auto-generated method stub
    String uri = params[0];
    HttpGet get = new HttpGet(uri);
    try {
        HttpResponse response = _client.execute(get);
        return FormJsonFromResponse();
    }
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }   
}

AsyncTask post execute

@Override
protected void onPostExecute(JSONObject result) {
    //Do something with result
    if (result != null) {
        try {
            Command.OnTaskComplete( result );
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}