Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:从后台线程向各种活动返回结果的正确方法_Android_Multithreading_Android Intent - Fatal编程技术网

Android:从后台线程向各种活动返回结果的正确方法

Android:从后台线程向各种活动返回结果的正确方法,android,multithreading,android-intent,Android,Multithreading,Android Intent,我有两个活动,活动A和活动B。ActivityA启动一个长期运行的过程(例如,在web上检索数据)。用户可随时决定转到ActivityB。一旦长时间运行的流程结束,其结果应显示在ActivityA或ActivityB中,以当时处于活动状态的为准 为了实现这一点,我在ActivityA中创建了一个工作线程,ActivityA和ActivityB都依赖于LocalBroadcastManager来通知长期运行进程的结束并获取其结果 这个实现似乎很有效,但我想知道我是否遗漏了一些角落案例。在这里,我看

我有两个活动,活动A和活动B。ActivityA启动一个长期运行的过程(例如,在web上检索数据)。用户可随时决定转到ActivityB。一旦长时间运行的流程结束,其结果应显示在ActivityA或ActivityB中,以当时处于活动状态的为准

为了实现这一点,我在ActivityA中创建了一个工作线程,ActivityA和ActivityB都依赖于
LocalBroadcastManager
来通知长期运行进程的结束并获取其结果

这个实现似乎很有效,但我想知道我是否遗漏了一些角落案例。在这里,我看到了关于
IntentService
AsyncTask
HandlerThread
的讨论,所以我担心我的方法可能太幼稚了。我这样做对吗?如果没有,我错过了什么

下面是一些代码片段来说明我的问题

活动a

活动b


您也可以考虑使活动实现一个接口,并在长时间运行的任务结束时调用这个接口。 AsyncTask主要用于执行长时间运行的任务,然后轻松更新UI


IntentService是一种在自己的线程上运行的服务,当您正在执行的给定任务完成时,它将被终止。

我的建议是考虑一种设置,它有一个线程模型,即基于片段的服务或活动。因为如果你在活动A中有你的线程,并且你移动到B,那么你将失去对线程的控制。你应该避免这种情况


正如我所说,我们有一个模型和一些视图,可以随时访问它并控制线程

让这些活动实现一个公共接口将是使用LocalBroadcastManager的替代方法。但是长时间运行的任务如何获得对ActivityB实例的引用呢?我已经知道AsyncTask和IntentService。我想了解的是,使用简单线程而不是这些重量级类是否有任何不利之处。您能否解释一下,当我的应用程序从活动a移动到活动B,从而失去对线程的控制时,会发生什么样的坏事情?
public class ActivityA extends Activity {

    public static final String BROADCAST_MESSAGE = "spike.workerthread.event.resultReady";
    public static final String RESULT_KEY = "spike.workerthread.result";
    private LocalBroadcastManager localBroadcastMgr;
    private BroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        localBroadcastMgr = LocalBroadcastManager.
            getInstance(getApplicationContext());
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TextView resultTextView = (TextView) findViewById(R.id.result);
                resultTextView.setText(intent.getStringExtra(RESULT_KEY));
            }};
        localBroadcastMgr.registerReceiver(receiver,
            new IntentFilter(BROADCAST_MESSAGE));
    }       

    public void startFetchingResultFrom(final ResultProvider provider) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                String result = provider.getResult(); // Can take a long time...
                Intent intent = new Intent(BROADCAST_MESSAGE);
                intent.putExtra(RESULT_KEY, result);
                localBroadcastMgr.sendBroadcast(intent);
            }
        };
        thread.start();
    }

    public void startActivityB() {
        Intent intent = new Intent(getApplicationContext(), ActivityB.class);
        startActivity(intent);
    }

}
public class ActivityB extends Activity {

    private LocalBroadcastManager localBroadcastMgr;
    private BroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        localBroadcastMgr = LocalBroadcastManager.getInstance(getApplicationContext());
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TextView resultTextView = (TextView) findViewById(R.id.result);
                resultTextView.setText(intent.getStringExtra(ActivityA.RESULT_KEY));
            }};
        localBroadcastMgr.registerReceiver(receiver, new IntentFilter(ActivityA.BROADCAST_MESSAGE));
    }
}