概述
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问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复