最近小菜要考试了,小菜在大二上学期的时候对安卓做过一些编程,所以对学校开设的这门课也是情有独钟,明天晚上就要考试安卓了,小菜还是淡定的写篇博客压压惊
以前在写小黄鸡音乐播放器的时候,需要在后台获取手机上存储的音乐文件的信息,有时候由于处理不当就会被安卓系统处理提示应用不反应的提示。。。
anr也就是application not response的缩写,站在现在水平看我大二刚接触安卓的时候的水平只能一笑而过,处理耗时操作可以用三种方式来解决:
1,用服务service的方式进行后台操作。
2,在UI线程的基础上开一个子线程来处理耗时操作。
不过这种开子线程的方式有一个问题,就是子线程并不能修改ui(ui线程是主线程)的内容,组建由哪个线程创建,哪个线程才有能力对UI进行修改。
3,用异步处理类来解决这个问题。
现在重点来讨论下第二种和第三种处理方式:
第二种方式可以使用Thread +Handler+Message的方式进行耗时处理并更新界面。
例子如下:
public class MainActivity extends Activity implements OnClickListener { private Button bget; private ImageView imageView; Handler handler = new Handler() { public void handleMessage(Message msg) { Bitmap bmp = (Bitmap) msg.obj; imageView.setImageBitmap(bmp); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bget = (Button) findViewById(R.id.bget); imageView = (ImageView) findViewById(R.id.imageview); bget.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub new Thread() { public void run() { try { URL url = new URL("http://10.0.2.2:9999/testdemo/images/pre4.jpg"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(false); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() ==200) { InputStream inputStream = conn.getInputStream(); Bitmap bmp = BitmapFactory.decodeStream(inputStream); Message message = new Message(); message.obj = bmp; handler.sendMessage(message); } } catch (Exception e) { // TODO: handle exception } } }.start(); } }
第三种方式是使用安卓sdk中带的类AsyncTask,通过继承AsyncTask可以用像ajax的方式来实现异步操作。
public class MainActivity extends Activity implements OnClickListener { private Button bget; private ImageView imageView; Handler handler = new Handler() { public void handleMessage(Message msg) { Bitmap bmp = (Bitmap) msg.obj; imageView.setImageBitmap(bmp); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bget = (Button) findViewById(R.id.bget); imageView = (ImageView) findViewById(R.id.imageview); bget.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub MyAsyncTask myAsyncTask = new MyAsyncTask(); myAsyncTask.execute("http://10.0.2.2:9999/testdemo/images/pre4.jpg"); //"http://10.0.2.2:9999/testdemo/images/pre4.jpg" } // 第一个参数就是一个字符串,就是网络上的url地址 // 第二个参数是 Integer,标明进度... // 第三个参数指的是返回的值 class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { // 任务执行前调用的方法,它是在主线程中执行的 @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } // 后台执行的任务,它是在子线程中...这个的方法的返回参数,会 // 做为onPostExecute()中的传递参数. @Override protected Bitmap doInBackground(String... params) { // TODO Auto-generated method stub String urlstr = params[0]; try { URL url = new URL(urlstr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(false); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() ==200) { InputStream inputStream = conn.getInputStream(); Bitmap bmp = BitmapFactory.decodeStream(inputStream); return bmp; } } catch (Exception e) { // TODO: handle exception } return null; } //任务执行完毕,调用的方法.它也是在主线程中执行的 @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub // super.onPostExecute(result); imageView.setImageBitmap(result); } } }
大概就是这样了,第一种方式有很多例子这里就不在讨论了,待小菜考试结束再来补充
相关推荐
android anr ANR
Android图片压缩解决方案,解决图片加载过程中ANR现象
本文对Android中常发生的ANR现象的成因原理及主要发生场景进行了简要介绍,举例了几种典型的ANR场景实例。总结提供了优化改善的若干解决思路。 值得Android开发人员收藏!
Android ANR详细介绍以及案例分析,对理解ANR具体原理有说明,并且列举大量实例解决实际问题,不可多得的稳定性文档。
一个防止ANR错误HandlerThread多线程解决耗时操作的源码程序20210525记录学习
Android图片压缩解决方案,解决图片加载过程中ANR现象.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
为了解决这些问题,故而开发了此款软件,该软件不仅解决了上述问题,而且还支持对日志文件进行离线分析和导出备份,支持对日志内容的横向过滤和纵向过滤,且可通过ADB工具直连物理设备进行日志的监控和分析,无需...
15.1.4 响应速度优化和ANR日志分析 496 15.1.5 ListView和Bitmap优化 501 15.1.6 线程优化 501 15.1.7 一些性能优化建议 501 15.2 内存泄露分析之MAT工具 502 15.3 提高程序的可维护性 506
只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往应用层发展。 而Android的底层就是Framework。Framework虽然比较偏底层,圈子较窄,但...
15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露分析之MAT工具 / 502 15.3 提高程序的可维护性 / 506
ANR(Android not response)现象 ANR解决方案 Android线程 主子线程交互技术 Handler/Message/Looper/MessageQueue 异步任务asynTask IntentService 广播和BrocastReceiver(*)
Android各种ANR日志汇总,希望对解决各种ANR有帮助。非常全。
只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往应用层发展。 而Android的底层就是Framework。Framework虽然比较偏底层,圈子较窄,但...
/ 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View...
Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示过程 图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System...
只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往应用层发展。 而Android的底层就是Framework。Framework虽然比较偏底层,圈子较窄,但...
关于根据ANR log进ANR问题的排查与解决的式笔者已经在深探索Android稳定性优化的第三节ANR优化中讲解过了,这就不多赘述了。在 深 探 索 Andr
Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示过程 图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System...