繁体   English   中英

通知活动类有关服务或线程类的操作

[英]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.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM