E/错误(3907): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the o



E/错误(3907): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the o

最近在做一个Android客户端,和Struts2搭建的服务器之间的通信,采用HTTP通信,以前做的都是简单的Android客户端,没有什么特别耗时的操作,所以这次就在Android中的耗时程序头疼,于是通过查看资料就开通了子线程,但是在子线程中却抛出异常:android.view.ViewRootImpl$CalledFromWrongThreadException。
一般在Android程序中,为了控制UI线程,都会控制主线程的时间,一般是5秒,因为我开通了子线程,而且这个线程需要通过HTTP协议获取服务器上的数据,所以,比较耗时。而且,在子线程中需要对UI组件的更新操作,所以,线程超时,导致android.view.ViewRootImpl$CalledFromWrongThreadException的异常。
官方推荐解决方案:引入AsyncTask类,重写doInBackground方法和onPostExecute方法。
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
package com.example.service_android;

import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
public void run(){
new AnotherTask().execute(“JSON”);
}
}.start();
}
private class AnotherTask extends AsyncTask<String, Void, String>{
@Override
protected void onPostExecute(String result) {
//对UI组件的更新操作
}
@Override
protected String doInBackground(String… params) {
//耗时的操作
return params[0];
}
}
}
在doInBackground(Params…)方法中写耗时的操作。在onPostExecute(Result),中写对UI的操作。
解决这个问题的方法好像很多,但是,感觉这个还不错。