我刚接触android,请稍等片刻。
这是一个非常简单的场景,有一个actionbar,当选择一个标签时,我需要发送一个http请求来获取文章列表,当响应到达时,更新一个listview,这就是我得到这个异常的地方。
我意识到我应该将网络操作与UI线程隔离开来,所以我在AsyncTask类中实现了网络函数。
最奇怪的是,在我尝试获取文章列表之前,我实际上已经调用了一次网络函数来登录,而且工作得很好,没有例外!猜猜发生了什么,如果我将get文章列表调用替换为log in调用,它也能正常工作。除了参数不同之外,所有的代码都是相同的。
下面是我如何做的,因为太多的模块将使用网络模块,所以我使用静态包装器:
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 post执行
@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);
}发布于 2012-12-27 08:54:55
按照以下模式修改您的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执行
@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();
}
}
}https://stackoverflow.com/questions/14047982
复制相似问题