activity中 处理子线程(工作线程)有两原则:
1. Do not block the UI thread (不要阻塞UI线程)
2. Do not access the Android UI toolkit from outside the UI thread (不要在工作线程中操作UI元素)
原因:
* 当在UI线程中进行某些耗时的操作时,将会阻塞UI线程,一般阻塞超过5秒就会显示一个ANR对话框。
* UI线程是非线程安全的,所以,不能在工作线程中操作UI元素。
例如以下代码
new Thread(new Runnable() {
@Override
public void run()
{
//处理耗时操作, 例如请求后台数据
//处理ui元素, 例如给ui控件设置......
}
}
以上操作都会抛如标题所示的异常:
解决此问题,可以使用android官方提供的 AsyncTask<String, Void, String> 来解决
首先可以写个内部类继承该类,
然后重写doInBackground方法和onPostExecute方法
在doInBackground方法中处理一些耗时的操作, 如请求后台数据...
在onPostExecute方法中处理ui元素的一些操作,如把请求得到的后台数据添加给相应的ui控件
以下是一个基本代码
/** 异步获取数据*/
class MyTask extends AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String result) {
// 对UI组件的更新操作
// 接收的result参数,就是下面return过来的数据
// 可以把数据处理了后,扔给ui控件
}
@Override
protected String doInBackground(String... params) {
// 耗时的操作
// 如请求后台数据, 可以把请求到的数据return出去
return params[0];
}
}
转载于:https://blog.51cto.com/zhaodan/1695432