我是靠谱客的博主 顺心鞋子,最近开发中收集的这篇文章主要介绍ANR问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ANR问题

ANR(application not response)问题,一般规定,

a、UI线程在5秒内没有响应

b、广播对象不能在10秒内完成onRecieve方法


解决方法:

1、handler+thread

多线程基础:

Thread mthread=new Thread(){
	@Overrid
	void run(){
		//在此处进行耗时操作
	}
};
mthread.start();

安卓操作系统在UI线程当中,维护一个messagequeue和一个looper

looper伪代码:

while(true){
	msg=getfirstmessage(messagequeue);
	if(msg!=null){
		processmessage();
	}
}

looper通过一个死循环,当有消息加入队列时,通过FIFO的顺序处理消息。

一个Message对象包括了处理message的handler对象还有消息内容

handler与UI在同一个线程

handler更新进度条例子:

class myThread extends Thread { 
	int i = 0; 
	@Override 
	public void run() { 
		i+=3; // 发送进度信息给handler 
		Message msg = handler.obtainMessage(); 
		msg.arg1= i; handler.sendMessage(msg); 
		if(i >= 100 ) { // handler取消回调 
			handler.removeCallbacks(this); 
		} 
	} 
};

mThread = new myThread(); 
mThread.start();

Handler handler = new Handler(){ 
	@Override 
	public void handleMessage(Message msg) { 
		super.handleMessage(msg); 
		switch (msg.what) {  // 根据消息类型进行操作 
			case -1: handler.removeCallbacks(mThread); 
			break; 
			default: // 接收进度并更新UI,100毫秒后重新调
			mThread progressBar.setProgress(msg.arg1); 
			handler.postDelayed(mThread,100); 
			} 
	} 
}


2、AsyncTask

AsyncTask内部实现是一个线程池,每个后台任务会 提交到 线 程 池 中 的 线 程 执 行 , 然 后 使 用 Thread+Handler的方式调用回调函数。

将后台线程分为五个状态并执行对应的函数:

a、准备运行

onPreExcute()

b、正在后台运行

doInBackground(Params..)

一般里面会执行publishProgress(Progress)函数,该函数调用之后,立马调用onProgressUpdate函数

c、进度更新

onProgressUpdate(Progress..)

d、完成任务

onPostExecute(Result)

e、取消任务

onCancelled()


AsyncTask的构造函数含有三个模板参数:

三个模板参数<Params type, Progress type, Result type> 

1.Params,传递给后台任务的参数类型。

2.Progress,后台计算执行过程中,进度单位(progress units) 的类型。(就是后台程序已经执行了百分之几了。) 3.Result, 后台执行返回的结果的类型

class MyTask extends AsyncTask<Integer,Integer,Integer> { 
	@Override 
	protected Integer doInBackground(Integer... params) {
		//重写该函数,实现后台处理大规模计算 return null; 
	} 
	@Override 
	protected void onProgressUpdate(Integer... values) { 
	super.onProgressUpdate(values);
	//重写该回调函数,更新UI 
	} 
}
//点击开始按钮时,实例化并运行
task = new MyTask(); task.execute();
//点击停止按钮时
task.cancel(true);


3、RxJava

RxJava 的异步实现,通过一种扩展的观察者模式来实现

观察者模式面向的需求是: A 对象(观察者)对 B 对象(被观察者)的某种变化 高度敏感,需要在 B 变化的一瞬间做出反应

程序中的观察者模式,观察者不需要时刻盯着被观察者 (例如 A 不需要每过 2ms 就检查一次 B 的状态)
而是采用注册(Register)或者称为订阅(Subscribe)的方 式,告诉被观察者:我需要你的某某状态,你要在它变 化的时候通知我。


优点: 1. 省去了反复检索状态的资源消耗 2. 能够得到最高的反馈速度


• 使用 Observable.observeOn() 可以定义在一个线程上, 可以用来监听和检查从 Observable 最新发出的 items (Subscriber 的 onNext,onCompleted 和 onError 方法会执行在 observeOn 所指定的线程上)
• Observable.subscribeOn() 来定义一个线程,将其运 行我们 Observable 的代码(长时间运行的操作)

该方法是基于观察者Oberver(Subsriber)与被观察者Observale的

Observable operationObservable = Observable.create(new Observable.OnSubscribe() { 
	@Override public void call(Object o) { 
		… 
	} 
}
) 
.subscribeOn(Schedulers.newthread) 
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new subscriber(){
	@Overrid
	public void onCompleted() { 
		
	}  
	@Overrid
	public void onError() { 
	
	} 
	@Overrid
	public void onNext() { 
		
	}
	@Overrid
	public void onStart() { 
		
	}
	
}
); // observeOn the UI Thread;






最后

以上就是顺心鞋子为你收集整理的ANR问题的全部内容,希望文章能够帮你解决ANR问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部