我在我的代码中使用了IntentService而不是Service,因为IntentService在onHandleIntent(Intent intent)中为我创建了一个线程,所以我不必在我的服务代码中创建一个Thead。

我期望同一个IntentSerivce的两个意图将并行执行,因为在IntentService中为每个发明生成一个线程。 但我的代码证明了两个意图以顺序方式执行。

这是我的IntentService代码:

public class UpdateService extends IntentService {

    public static final String TAG = "HelloTestIntentService";

    public UpdateService() {
        super("News UpdateService");
    }

    protected void onHandleIntent(Intent intent) {

        String userAction = intent
        .getStringExtra("userAction");

        Log.v(TAG, "" + new Date() + ", In onHandleIntent for userAction = " + userAction + ", thread id = " + Thread.currentThread().getId());

        if ("1".equals(userAction)) {
            try {
                Thread.sleep(20 * 1000);
            } catch (InterruptedException e) {
                Log.e(TAG, "error", e);
            }

            Log.v(TAG, "" + new Date() + ", This thread is waked up.");
        }
    }
}

代码调用服务如下:

public class HelloTest extends Activity {

    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Intent selectIntent = new Intent(this, UpdateService.class);
        selectIntent.putExtra("userAction",
                "1");

        this.startService(selectIntent);

        selectIntent = new Intent(this, UpdateService.class);
        selectIntent.putExtra("userAction",
                "2");

        this.startService(selectIntent);

    }
}

我在日志中看到了这条日志消息:

V/HelloTestIntentService(  848): Wed May 05 14:59:37 PDT 2010, In onHandleIntent for userAction = 1, thread id = 8
D/dalvikvm(  609): GC freed 941 objects / 55672 bytes in 99ms
V/HelloTestIntentService(  848): Wed May 05 15:00:00 PDT 2010, This thread is waked up.
V/HelloTestIntentService(  848): Wed May 05 15:00:00 PDT 2010, In onHandleIntent for userAction = 2, thread id = 8
I/ActivityManager(  568): Stopping service: com.example.android/.UpdateService

日志显示第二个intent等待第一个意图完成并且它们位于同一个线程中。

有什么我误解了IntentService。 要使两个服务意图并行执行,我是否必须用服务替换IntentService并在服务代码中自己启动一个线程?

谢谢。

===============>>#1 票数:9

意图排队是使用IntentService的重点。

===============>>#2 票数:7

对IntentService的所有请求都在单个工作线程上处理,并且一次只处理一个请求。 如果你想并行完成两个任务,我认为你需要在Service启动后使用Service并为每个任务创建线程。

至于AsyncTask,有一个用于处理所有任务的线程池。 如果您的任务编号超过了线程池大小,则其中一些AsyncTasks需要等到池中的线程可用。 但是,线程池大小在不同平台版本中更改。

这是我的测试结果:

  • Android 2.2:线程池大小= 5
  • Android 1.5:线程池大小= 1

===============>>#3 票数:6

据我所知,IntentService有一个处理程序线程,每个intent在该线程中排队。 完成所有排队的意图后,服务退出。 它不会为每个意图创建独立的线程。 我不知道任何以您描述的方式工作的Service子类,您可能必须编写自己的子类。

===============>>#4 票数:1

我认为你想要的是AsyncTask而不是Service或IntentService。 或者你总是可以通过定义像这样的runnable从臀部射击:

Runnable runnable = new Runnable() {

    public void run() {
        ....
    }
};
new Thread(runnable).start();

......为你的每一项任务。 老实说,这可能比处理这些Android助手类更容易。

===============>>#5 票数:0

以下是使用Service而不是IntentService的示例,它可能会满足您的需求。 http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService

  ask by user256239 translate from so

未解决问题?本站智能推荐:

1回复

ProGuard意外行为

我有一个Android项目,我正在使用progaurd来混淆代码。 我在progaurd-pro文件中有一些自定义规则,可以忽略模型文件。 它忽略包中的所有模型文件,但它不会忽略一个特定文件。 我试过了什么 我将所有模型移动到不同的模块仍然没有区别该文件没有被忽略
2回复

onDataChange意外行为

我在FirstActivity.java上有以下代码: 在SecondActivity.java ,我更新了data值,并在更新时立即启动ThirdActivity ,尽管我从未在SecondActivity调用此活动,并且我怀疑这是由于它发生在FirstActivity.java (这
1回复

图像裁剪中的意外行为

我正在裁剪(默认)相机应用返回的图像,但结果是文件较大(约大4倍)。 我刚刚发现了文件大小差异。 难怪我得到了OutOfMemoryErrors 。 我知道我可以使用BitmapFactory.Options inSampleSize但是我真的只是想裁剪原始Image而不会丢失细节。
3回复

NavigationDrawer双击意外行为

我已经根据需要实施了导航,并且工作正常。 当我尝试双击任何菜单项时,第一次单击将执行所需的操作,但是第二次单击将被理解为打开导航抽屉。 因此,我面临的问题是,在菜单项上双击(这不是正常的用户行为,这是我们测试人员报告的错误),导航抽屉在新屏幕上保持打开状态。 如果单击一次,则可以正常工
1回复

Android标签意外行为

我正在使用SDK API级别23的android应用程序工作,我的一个屏幕带有使用viewpager的标签布局。 问题是,当我单击一个选项卡时,创建的下一个选项卡就被火了! 这是选项卡片段的代码: 这是布局XML的代码:
1回复

ViewPager中的setSoftInputMode()-意外行为

我在ViewPager中有2个片段,我希望窗口根据第二个片段的软键盘进行不同的调整。 这是我正在尝试的: 观察到的行为: 输入第一个片段,默认的softInputMode可以正常工作。 滑动到第二个片段和断点将显示softInputMode应该设置为ADJUST_NO
2回复

Android AutoCompleteTextView意外行为

我在我的应用程序中使用AutoCompleteTextView,但是它工作异常。 AutoComplete列表从列表中显示不需要的文本,我没有在寻找,但是当我选择此文本并从autocomletetextview移开焦点时,它会将适当的文本设置为autocompletetext字段。 另一个问
1回复

InputFilter中空格的意外行为

我希望没有人在编辑文本中放置空格,而是通过使用输入过滤器来做到这一点,但这是我面临的另一个问题,当我按下空格键两次时空按钮作为退格键并删除用户已经输入的字符时。 如果有人解决了这个问题,我将不胜感激。 代码是:这是我将输入过滤器设置为editText的地方。 这是我的全局输入过滤器方
2回复

意外行为替换片段

抱歉,很长的帖子,我试图使其尽可能地可读。 我对JAVA有一定的了解,并试图了解Android编程。 今天,我一直在研究片段知识。 我已经阅读了这篇文章并获得了使用它们的基础知识。我设法制作了片段并在需要时更换它们。 我进行了这个项目 ,并认为尝试用我为练习目的而构建的基本t
1回复

android程序的意外行为

我想在Google搜索按钮后面运行脚本,这意味着...将表单发布到谷歌服务器并以html字符串的形式获取响应,最后我将该字符串放在webview上以显示结果....然后我运行代码...有时它显示正确的结果(就像有人点击谷歌搜索按钮)但有时它显示消息“强制关闭”没有任何改变我做的代码....这意味