`
come_for_dream
  • 浏览: 120728 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Android如何解决ANR

阅读更多

吻吻吻吻吻吻吻吻最近小菜要考试了,小菜在大二上学期的时候对安卓做过一些编程,所以对学校开设的这门课也是情有独钟,明天晚上就要考试安卓了,小菜还是淡定的写篇博客压压惊吻吻吻吻吻吻吻吻吻

           以前在写小黄鸡音乐播放器的时候,需要在后台获取手机上存储的音乐文件的信息,有时候由于处理不当就会被安卓系统处理提示应用不反应的提示。。。

           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一个用于检测AndroidANR(应用不响应)的watchdog

    `Android-ANR-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够帮助开发者监控并处理ANR错误,从而提高应用的稳定性和用户体验。 `Android-ANR-WatchDog`的工作原理是通过创建一个后台线程,该线程不断...

    android anr

    Android ANR,全称为"Application Not Responding",是Android操作系统中的一种错误状态,提示用户...通过对这些内容的学习,开发者可以更深入地理解ANR的原理,并掌握防止和解决ANR的方法,从而提高应用的用户体验。

    通过Android trace文件分析死锁ANR实例过程

    本文将通过一个具体的死锁导致的ANR实例,解析如何利用Android trace文件来分析和解决这类问题。 当Android系统检测到ANR发生时,会在/data/anr/目录下自动生成一个trace文件,其中包含了系统运行时的详细信息,如...

    Android图片压缩解决方案,解决图片加载过程中ANR现象

    本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,提高用户体验。 首先,理解ANR全称为Application Not Responding,当Android系统检测到主线程被阻塞超过5秒钟时,就会向用户显示ANR对话框。图片加载...

    ANR代码流程分析.doc.tar.gz_ANR分析_android_anr代码_shp

    本文档"ANR代码流程分析.doc"将深入探讨ANR的产生原因及其相关的代码流程,这对于Android开发者理解和解决这类问题至关重要。 ANR现象通常出现在以下几种情况: 1. 主线程执行耗时操作:主线程负责处理用户交互,...

    如何分析及避免Android ANR问题.pdf

    ANR(Application Not Responding)问题是Android应用开发者经常会遇到的问题,尤其对于初学者来说,解决这类问题往往比较棘手。ANR问题通常发生在Android应用无法在规定时间内响应输入事件或广播消息时,导致系统弹...

    android anr分析.docx

    Android ANR 分析 ANR(Application Not Responding)是 Android 中的一个错误状态,...本文总结了 ANR 的定义、引发原因、避免方法、检测和分析、解决方法等方面的知识点,为 Android 开发者提供了有价值的参考信息。

    Android性能优化 ANR 分析指导文档

    Android性能优化 ANR 分析指导文档 一、什么是 ANR? 在 Android 系统中,应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。...这些方法可以帮助我们调试 ANR 问题,并找到解决方案。

    浅谈Android ANR在线监控原理

    Android ANR在线监控原理是Android操作系统中的一种重要机制,能够有效地解决ANR问题,提高系统的稳定性和可靠性。开发者可以通过了解Watchdog监控机制的实现机理来更好地实现应用程序的监控和优化。

    防止ANR错误HandlerThread多线程解决耗时操作MyProject.zip

    在Android应用开发中,"ANR"(Application Not Responding)是开发者经常遇到的问题,它意味着用户界面在一段时间内没有响应用户的操作,通常超过5秒钟。这种情况下,系统会弹出对话框询问用户是否要强制关闭应用。...

    Android ANR详细介绍以及案例分析

    Android ANR详细介绍以及案例分析,对理解ANR具体原理有说明,并且列举大量实例解决实际问题,不可多得的稳定性文档。

    ANR的监测与定位Demo

    ANR,全称为"Application Not Responding",是Android系统中用于表示应用程序无响应的错误提示。当一个Android应用的主线程在5秒内没有处理完事件(如UI更新、用户输入等)或者BroadcastReceiver在10秒内没有完成...

    ANR各种日志.rar

    总之,理解和解决ANR问题需要对Android应用的运行机制有深入理解,以及熟练掌握日志分析技巧。通过优化主线程的工作负载,合理安排任务执行,以及定期清理资源,可以有效防止ANR的出现,从而提升应用的用户体验。

    干货!ANR日志分析全面解析.docx

    ANR(Application Not Responding)日志分析是 Android 开发者需要掌握的重要技巧之一。ANR 的产生机制可以分为四类:输入事件超时、广播类型超时、服务超时和 ContentProvider 类型超时。ANR 的原因也可以分为两类...

    ANR软件.rarANR软件.rar

    ANR(Application Not Responding)在Android系统中是一个常见的错误提示,意味着某个应用程序无响应,导致用户界面无法正常交互。ANR软件可能是针对这一问题的一种解决方案或者分析工具,旨在帮助开发者诊断和解决...

    安卓手绘图片处理画板相关-Android图片压缩解决方案解决图片加载过程中ANR现象.rar

    本压缩包中的资源提供了关于如何在Android系统中有效地进行图片压缩,以避免ANR现象的一系列解决方案。 首先,我们要理解ANR(Application Not Responding)是什么。当一个Android应用在主线程上执行耗时操作超过5...

    /data/anr/traces.txt案例

    总之,解决ANR问题需要深入理解Android应用的运行机制,尤其是主线程的重要性,以及如何正确处理异步任务和资源管理。通过对`/data/anr/traces.txt`的仔细分析,配合其他调试工具和策略,通常可以有效地定位和解决这...

    Android通过Log解决问题的例子(经验之谈)

    解决ANR问题的一般步骤如下: 1. **查看关键Log条目**:找出与ANR相关的Log条目,通常是`Binder_XX`、`ActivityManager`或`dalvikvm`打印的错误信息。 2. **定位问题代码**:根据Log中的堆栈跟踪信息,找到引起阻塞...

    效能智优ANR.rar

    在描述中,同样只提到了“效能智优ANR.rar”,这可能是为了强调这个文件的名称,暗示其主要功能是提高Android应用的性能并解决ANR问题。由于信息有限,我们无法获取更多关于这个工具的具体功能和特性,但我们可以...

Global site tag (gtag.js) - Google Analytics