Android线程与进程(二)线程详解
16lz
2022-07-01
总结
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
更多相关文章
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android下Excel的操作
- Android之Handler用法总结
- Android开发之消息处理机制(一)——Handler
- Android异步加载图像小结 (含线程池,缓存方法)
- 【Android】文件读写操作(含SDCard的读写)
- android 面试题集