
[英]Accessing UI component on Activity from the Service class's Thread in Android
[英]Informing activity class about action from service or thread class
从服务类中,我正在启动一个线程。 如果线程类采取了任何措施,通知活动的最佳方法是什么? 我想通知我的活动课,线程已采取了某些措施。 问题将从下面的代码中明确
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有关。 谁能让我知道处理这种情况的最佳方法。
我建议您从后台服务中使用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
仅允许您将事情排队等待以后再使用,而不会完全阻塞线程。 在您的情况下,如果您要谈论大量的并发下载,这可能会有所帮助,但是开始时并不必要。
首先,您不需要使用Intent启动服务并将其绑定。 一个或另一个就足够了。
在这种情况下,我建议绑定到该服务,因为这使您有机会通过Handlers和Messengers建立通信。 您可以使用ServiceConnection类的onServiceConnected方法来获取在Service中定义的Messenger。 有关如何执行此操作的示例,请参见此处的创建绑定服务下的Android文档 。 在他们的示例中,他们返回对Service实例的引用,但是您应将其替换为对Messenger或Handler的引用。 一旦在“活动”和“服务”中都具有“处理程序/信使”,则来回通信应该很简单。 请注意,如果将处理程序放在后台线程中,则可能需要在线程的构造函数中调用Looper.prepare()。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.