android获取服务进程,android-IntentService中的ANR及其自己的进程

我有一个拥有自己流程的IntentService,就像这样:

AndroidManifest.xml

android:name="com.app.services.UpdateDatabaseService"

android:process=":updateDatabaseService"

android:label="@string/service_name"

android:exported="false" >

然后,当IntentService运行时,它将创建两个线程.线程是一项长期任务(超过1分钟),这是一项任务.我遇到了ANR问题.

10-24 18:51:27.923: E/ActivityManager(148): ANR in com.app:FooService

10-24 18:51:27.923: E/ActivityManager(148): Reason: Executing service com.app/.services.FooService

10-24 18:51:27.923: E/ActivityManager(148): Load: 1.08 / 0.48 / 0.21

10-24 18:51:27.923: E/ActivityManager(148): CPU usage from 13433ms to 1122ms ago:

10-24 18:51:27.923: E/ActivityManager(148): 92% 1375/com.emanga:updateMangaDatabase: 87% user + 5.7% kernel / faults: 5740 minor

10-24 18:51:27.923: E/ActivityManager(148): 0.4% 148/system_server: 0.2% user + 0.1% kernel / faults: 13 minor

10-24 18:51:27.923: E/ActivityManager(148): 0.2% 45/adbd: 0% user + 0.2% kernel

10-24 18:51:27.923: E/ActivityManager(148): 0.1% 758/logcat: 0% user + 0.1% kernel

10-24 18:51:27.923: E/ActivityManager(148): 0% 266/com.android.phone: 0% user + 0% kernel / faults: 2 minor

10-24 18:51:27.923: E/ActivityManager(148): 93% TOTAL: 87% user + 6.2% kernel + 0% irq

10-24 18:51:27.923: E/ActivityManager(148): CPU usage from 1804ms to 2442ms later:

10-24 18:51:27.923: E/ActivityManager(148): 70% 1375/com.emanga:updateMangaDatabase: 65% user + 4.9% kernel / faults: 123 minor

UI绝不会被阻塞.因此,如果服务在单独的进程中(而不是UI线程),为什么会出现此错误?

编辑1:

我将IntentService更改为Service,但仍然遇到相同的问题.我将尝试解释我想要得到的.我的应用程序的体系结构具有一些活动,这些活动显示了使用Loader从数据库恢复的数据.如果数据库没有要求的数据,则它将请求服务以从Internet恢复数据(该服务管理Internet请求,它解析一些html,用新数据更新数据库,最后该服务通知有关更改)

该服务具有其自身的过程,因为尽管该服务捕获了可能发生的异常,但这种方法可以使应用程序更强大,以应对互联网或解析器失败(应用程序不会崩溃)

加载程序的目的是从数据库中获取数据,服务的目的是从Internet中获取数据并更新数据库.加载程序和服务之间的通信仅用于通知更改或请求.

最后,该服务具有一个任务队列和一个运行任务的执行程序.

public class UpdateDatabaseService extends Service {

private static final String ACTION = "com.app.services.UpdateDatabaseService";

public static final String ACTION_TASK_1 = ACTION + ".latestChapters";

public static final String ACTION_TASK_2 = ACTION + ".latestMangas";

private static final byte PARALLELTASKS = 2;

public LinkedBlockingQueue tasks = new LinkedBlockingQueue();

private ExecutorService executor = Executors.newFixedThreadPool(PARALLELTASKS);

private final IBinder mBinder = new MyBinder();

public class MyBinder extends Binder {

public UpdateDatabaseService getService() {

return UpdateDatabaseService.this;

}

}

@Override

public IBinder onBind(Intent arg0) {

return mBinder;

}

@Override

public void onCreate(){

// By default always it does DefaultTask1

tasks.put(new DefaultTask1());

if(!isEmptyTable("tableFoo")){

tasks.put(new DefaultTask2());

}

executor();

}

public int onStartCommand(Intent intent, int flags, int startId) {

if(intent != null && intent.getAction() != null) {

String action = intent.getAction();

if(action == ACTION_TASK_1){

tasks.put(new Task1());

} else

if(action == ACTION_TASK_2){

tasks.put(new Task2());

}

}

// We want this service to continue running until it is explicitly

// stopped, so return sticky.

return START_STICKY;

}

private void executor(){

while(true){

executor.execute(tasks.take());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值