总结
1. 所有的组件都运行在主线程中,包括其生命周期回调函数。
2. 如果在主线程进行长时的网络请求或数据库查询操作,则可能会阻塞主线程出现 "application not responding" (ANR)异常。
3. android的UI套件不是线程安全的,不应在工作线程(或称后台线程)中操作UI, 必须在主线程中操作UI。android单线程模型的规则:1.不阻塞主线程。2. 不在主线程之外的线程中操作UI套件。
实例和解决方案
错误实例代码:
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork("http://example.com/image.png");
mImageView.setImageBitmap(b);
}
}).start();
}
解决方案
1. Activity.runOnUiThread(Runnable)
2. View.post(Runnable)
3. View.postDelayed(Runnable, long)
第二种方式如下
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
}
}).start();
}
通过Handler或AsyncTask处理
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute() */
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** The system calls this to perform work in the UI thread and delivers
* the result from doInBackground() */
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
Handler详解可参考:http://www.cnblogs.com/devinzhang/archive/2011/12/30/2306980.html