转载请标明出处:http://blog.csdn.net/donkor_/article/details/78875391

前言

ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成,会造成ANR — 应用程序无响应(ANR:Application Not Responding)的情况

▲ 分析 :

避免ANR最核心的一点就是在主线程减少耗时操作。这时我们建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题

▲ 区别 :

1. 首先IntentService是继承自Service;
2. Service不是一个单独的进程,它和应用程序在同一个进程中;
3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;
4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,
IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。
5. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。

▲ 例子 :

Service_demo

    public class MyService extends Service {      @Override      public void onCreate() {      super.onCreate();      }      @Override      public void onStart(Intent intent, int startId) {      super.onStart(intent, startId);      //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作      Log.e("MyService","onStart");      try {      Thread.sleep(20000);      } catch (InterruptedException e) {      e.printStackTrace();      }      Log.e("MyService","睡眠结束");      }      @Override      public IBinder onBind(Intent intent) {      return null;      }      }  

IntentService_demo

public class MyIntentService extends IntentService {  public MyIntentService() {  super("donkor");  }  @Override  protected void onHandleIntent(Intent intent) {  // 经测试,IntentService里面是可以进行耗时的操作的  //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent  //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个  Log.e("MyIntentService","onStart");  try {  Thread.sleep(20000);  } catch (InterruptedException e) {  e.printStackTrace();  }  Log.e("MyIntentService","睡眠结束");  }  } 

TextServiceActivity

public class TextServiceActivity extends Activity {      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding          //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)          startService(new Intent(this,MyIntentService.class));          startService(new Intent(this,MyIntentService.class));      }  } 

About me
Email :donkor@yeah.net
Android开发交流QQ群 : 537891203

更多相关文章

  1. Android多线程——线程池ThreadPoolExecutor详解及使用
  2. Android(安卓)实现微信登录详解
  3. android中get方式和post方式提交数据到服务器的区别
  4. 网络连接和概述
  5. chromium-cronet库的编译用于Android和ios平台实现quic协议
  6. android网络请求框架Volley(二)
  7. android P系统访问http请求最简单解决方案
  8. Android(安卓)Camera2 之 CameraCaptureSession 详解
  9. Android9.0 默认是禁止所有的http java.io.IOException: Clear

随机推荐

  1. android > APK更新
  2. Compile Busybox for Android
  3. android spinner 选中后显示字体的颜色设
  4. android window.requestWindowFeature()
  5. android webview 中网页数据与js交互
  6. java.lang.NullPointerException Attempt
  7. Android(安卓)Studio 用 JNI 实现与原生
  8. android蓝牙模块
  9. CheckBox android:paddingLeft 不兼容问
  10. JNI 无法确定Bitmap的签名