从我的服务类,我开始一个线程。如果线程类采取任何操作,那么通知活动的最佳方法是什么?我想通知我的活动类,线程采取了一些操作。问题将从以下代码中清楚
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时,请不要详细说明等等。我只需要告知我的活动下载已开始且下载完成。 Handler需要做些什么。任何人都可以告诉我处理这种情况的最佳方法。
答案 0 :(得分: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
}
}
Handler
只允许您将内容排队等待,而不会完全阻止您的线程。在你的情况下,如果你谈论大量的并发下载,这可能会有所帮助,但是没有必要开始。
答案 1 :(得分:0)
首先,您不需要使用Intent 和绑定它来启动服务。一个或另一个就足够了。
在这种情况下,我建议绑定到服务,因为这使您有机会通过处理程序和信使建立通信。您可以使用ServiceConnection类的onServiceConnected方法获取在服务中定义的Messenger。有关如何执行此操作的示例,请参阅创建绑定服务下的Android docs here。在他们的示例中,它们返回对Service实例的引用,但您应该将其替换为对Messenger或Handler的引用。一旦在Activity和Service中都有Handler / Messenger,来回沟通应该是微不足道的。请注意,如果将Handler放在后台Thread中,则可能需要在Thread的构造函数中调用Looper.prepare()。