最近小菜要考试了,小菜在大二上学期的时候对安卓做过一些编程,所以对学校开设的这门课也是情有独钟,明天晚上就要考试安卓了,小菜还是淡定的写篇博客压压惊
以前在写小黄鸡音乐播放器的时候,需要在后台获取手机上存储的音乐文件的信息,有时候由于处理不当就会被安卓系统处理提示应用不反应的提示。。。
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-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够帮助开发者监控并处理ANR错误,从而提高应用的稳定性和用户体验。 `Android-ANR-WatchDog`的工作原理是通过创建一个后台线程,该线程不断...
Android ANR,全称为"Application Not Responding",是Android操作系统中的一种错误状态,提示用户...通过对这些内容的学习,开发者可以更深入地理解ANR的原理,并掌握防止和解决ANR的方法,从而提高应用的用户体验。
本文将通过一个具体的死锁导致的ANR实例,解析如何利用Android trace文件来分析和解决这类问题。 当Android系统检测到ANR发生时,会在/data/anr/目录下自动生成一个trace文件,其中包含了系统运行时的详细信息,如...
本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,提高用户体验。 首先,理解ANR全称为Application Not Responding,当Android系统检测到主线程被阻塞超过5秒钟时,就会向用户显示ANR对话框。图片加载...
本文档"ANR代码流程分析.doc"将深入探讨ANR的产生原因及其相关的代码流程,这对于Android开发者理解和解决这类问题至关重要。 ANR现象通常出现在以下几种情况: 1. 主线程执行耗时操作:主线程负责处理用户交互,...
ANR(Application Not Responding)问题是Android应用开发者经常会遇到的问题,尤其对于初学者来说,解决这类问题往往比较棘手。ANR问题通常发生在Android应用无法在规定时间内响应输入事件或广播消息时,导致系统弹...
Android ANR 分析 ANR(Application Not Responding)是 Android 中的一个错误状态,...本文总结了 ANR 的定义、引发原因、避免方法、检测和分析、解决方法等方面的知识点,为 Android 开发者提供了有价值的参考信息。
Android性能优化 ANR 分析指导文档 一、什么是 ANR? 在 Android 系统中,应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。...这些方法可以帮助我们调试 ANR 问题,并找到解决方案。
Android ANR在线监控原理是Android操作系统中的一种重要机制,能够有效地解决ANR问题,提高系统的稳定性和可靠性。开发者可以通过了解Watchdog监控机制的实现机理来更好地实现应用程序的监控和优化。
在Android应用开发中,"ANR"(Application Not Responding)是开发者经常遇到的问题,它意味着用户界面在一段时间内没有响应用户的操作,通常超过5秒钟。这种情况下,系统会弹出对话框询问用户是否要强制关闭应用。...
Android ANR详细介绍以及案例分析,对理解ANR具体原理有说明,并且列举大量实例解决实际问题,不可多得的稳定性文档。
ANR,全称为"Application Not Responding",是Android系统中用于表示应用程序无响应的错误提示。当一个Android应用的主线程在5秒内没有处理完事件(如UI更新、用户输入等)或者BroadcastReceiver在10秒内没有完成...
总之,理解和解决ANR问题需要对Android应用的运行机制有深入理解,以及熟练掌握日志分析技巧。通过优化主线程的工作负载,合理安排任务执行,以及定期清理资源,可以有效防止ANR的出现,从而提升应用的用户体验。
ANR(Application Not Responding)日志分析是 Android 开发者需要掌握的重要技巧之一。ANR 的产生机制可以分为四类:输入事件超时、广播类型超时、服务超时和 ContentProvider 类型超时。ANR 的原因也可以分为两类...
ANR(Application Not Responding)在Android系统中是一个常见的错误提示,意味着某个应用程序无响应,导致用户界面无法正常交互。ANR软件可能是针对这一问题的一种解决方案或者分析工具,旨在帮助开发者诊断和解决...
本压缩包中的资源提供了关于如何在Android系统中有效地进行图片压缩,以避免ANR现象的一系列解决方案。 首先,我们要理解ANR(Application Not Responding)是什么。当一个Android应用在主线程上执行耗时操作超过5...
总之,解决ANR问题需要深入理解Android应用的运行机制,尤其是主线程的重要性,以及如何正确处理异步任务和资源管理。通过对`/data/anr/traces.txt`的仔细分析,配合其他调试工具和策略,通常可以有效地定位和解决这...
解决ANR问题的一般步骤如下: 1. **查看关键Log条目**:找出与ANR相关的Log条目,通常是`Binder_XX`、`ActivityManager`或`dalvikvm`打印的错误信息。 2. **定位问题代码**:根据Log中的堆栈跟踪信息,找到引起阻塞...
在描述中,同样只提到了“效能智优ANR.rar”,这可能是为了强调这个文件的名称,暗示其主要功能是提高Android应用的性能并解决ANR问题。由于信息有限,我们无法获取更多关于这个工具的具体功能和特性,但我们可以...