您的位置:首页 > 移动开发 > Android开发

Android之Service与IntentService的比较

2011-12-29 10:34 337 查看
稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:

1.Service:

package com.zhf.service;

import Android.app.Service;

import Android.content.Intent;

import Android.os.IBinder;

public class MyService extends Service {

@Override

public void onCreate() {

super.onCreate();

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作

System.out.println("onStart");

try {

Thread.sleep(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("睡眠结束");

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

2.IntentService:

package com.zhf.service;

import Android.app.IntentService;

import Android.content.Intent;

public class MyIntentService extends IntentService {

public MyIntentService() {

super("yyyyyyyyyyy");

}

@Override

protected void onHandleIntent(Intent intent) {

// 经测试,IntentService里面是可以进行耗时的操作的

//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent

//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个

System.out.println("onStart");

try {

Thread.sleep(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("睡眠结束");

}

}

测试主程序:

package com.zhf.service;

import Android.app.Activity;

import Android.content.Intent;

import Android.os.Bundle;

public class ServiceDemoActivity extends Activity {

/** Called when the activity is first created. */

@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));

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: