E/错误(3907): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the o
16lz
2021-01-23
最近在做一个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{@Overrideprotected void onPostExecute(String result) { //对UI组件的更新操作}@Overrideprotected String doInBackground(String... params) {//耗时的操作return params[0];} }}
在doInBackground(Params...)方法中写耗时的操作。在onPostExecute(Result)
,中写对UI的操作。
解决这个问题的方法好像很多,但是,感觉这个还不错。
更多相关文章
- [置顶] Android 操作SQLite数据库(初步)-在程序中删除数据库
- android UI线程向子线程发送Message
- [置顶] Android中数据存储的5种方法
- Android中使用SQlite进行数据操作
- 基于RTP和Android的视频传输的研究实现方法
- Android的子线程能更新UI吗?
- Android 中.aar文件生成方法与用法
- Android Studio中获取sha1证书的方法