最近在做一个Android客户端,和Struts2搭建的服务器之间的通信,采用HTTP通信,以前做的都是简单的Android客户端,没有什么特别耗时的操作,所以这次就在Android中的耗时程序头疼,于是通过查看资料就开通了子线程,但是在子线程中却抛出异常:android.view.ViewRootImpl$CalledFromWrongThreadException。
一般在Android程序中,为了控制UI线程,都会控制主线程的时间,一般是5秒,因为我开通了子线程,而且这个线程需要通过HTTP协议获取服务器上的数据,所以,比较耗时。而且,在子线程中需要对UI组件的更新操作,所以,线程超时,导致android.view.ViewRootImpl$CalledFromWrongThreadException的异常。
官方推荐解决方案:引入AsyncTask类,重写doInBackground方法和onPostExecute方法。
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的操作。
解决这个问题的方法好像很多,但是,感觉这个还不错。