0

从我的服务类,我开始一个线程。如果线程类采取任何行动,通知活动的最佳方式是什么?我想通知我的活动类线程已经采取了一些行动。问题将从下面的代码中清楚

MyService 类 onCreate() 方法

@Override
public void onCreate()
{
    super.onCreate();

    if (downloadThread == null) {
        downloadThread = new DownloadThread(this);
        downloadThread.activateUserSession();
        downloadThread.start();
    }
}

我的下载线程

public void run()
{
    while (!isStopRequested) {
        if (isSessionActive && downloadNow) 
        {

            downloadNow = false;
            informActivity("Download Started");

            //do some loading work !!
            SystemClock.sleep(10000);

            informActivity("Download Finished");
        }

        SystemClock.sleep(2000);
    }
}

当 downloadNow 为 true 等时,不要详细说明。我只需要如何通知我的活动下载开始和下载完成。处理程序需要做一些事情。任何人都可以让我知道处理这种情况的最佳方法。

4

2 回答 2

1

我建议您startActivity从后台服务中使用。因此,以最简单的形式,您可以

String theEvent = "downloadStarted";
Intent intentForActivity = new Intent(this, MyActivity.class);
intentForActivity.putExtra(THE_EVENT, theEvent);
startActivity(intentForActivity)

如果您的活动已经在运行(如您所描述的),那么入口点将是onNewIntent,您可以在此处拉出THE_EVENT并逐案处理

onNewIntent(Intent intent) {
    String theEvent = intent.getExtra(THE_EVENT);
    if (theEvent.equals("downloadStarted") {
        // do your stuff
    } else if (theEvent.equals("downloadCompleted") {
        // do your other stuff 
    }
}

AHandler只是允许您将事情排队以备后用,而不会完全阻塞您的线程。在您的情况下,如果您谈论大量并发下载,这可能会有所帮助,但不必开始。

于 2013-11-08T04:55:33.653 回答
0

首先,您不需要使用 Intent 启动 Service绑定到它。一种或另一种就足够了。

在这种情况下,我建议绑定到服务,因为这使您有机会通过处理程序和信使建立通信。您可以使用 ServiceConnection 类的 onServiceConnected 方法来获取 Service 中定义的 Messenger。有关如何执行此操作的示例,请参阅此处创建绑定服务下的 Android 文档。在他们的示例中,它们返回对 Service 实例的引用,但您应该将其替换为对 Messenger 或 Handler 的引用。一旦在 Activity 和 Service 中都有一个 Handler/Messenger,来回通信应该是微不足道的。请注意,如果您在后台线程中放置一个处理程序,您可能需要在线程的构造函数中调用 Looper.prepare()。

于 2013-11-08T06:28:57.967 回答