Android:将结果从后台线程返回到各种 Activity 的正确方法

标签 android multithreading android-intent

我有两个 Activity ,ActivityA 和 ActivityB。 ActivityA 启动一个长时间运行的进程(例如,在网络上检索数据)。在任何时候,用户都可以决定转到 ActivityB。一旦长时间运行的进程结束,它的结果应该显示在 ActivityA 或 ActivityB 中,以当时处于 Activity 状态的为准。

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

这个实现似乎有效,但我想知道我是否遗漏了一些极端情况。在 SO 上,我看到有关 IntentService 的讨论, AsyncTaskHandlerThread ,所以我担心我的方法可能过于幼稚。我这样做是正确的方式吗?如果没有,我错过了什么?

这里有一些代码 fragment 来说明我的问题。

Activity A

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);
    }

}

Activity B
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));
    }
}

最佳答案

您还可以考虑让 Activity 实现一个接口(interface),并在长时间运行的任务完成时调用该接口(interface)。

当您想要执行长时间运行的任务然后轻松更新 UI 时,主要使用 AsyncTask。

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

关于Android:将结果从后台线程返回到各种 Activity 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687957/

相关文章:

android - java.lang.RuntimeException : Parcel: unable to marshal value com. package.NutritionInfo@84055e1

android - 什么是使用 Messenger 或 Intent 进行更快的交流?

android - putExtra 似乎根本不起作用。使用ListView获取字符串和使用listView显示字符串

android - 使用 Firebase 应用检查不起作用(调试)

javascript - 使用 javascript 映射读取键值对以填充选择器 react native 时出错

C# 将代码添加到 FormClosing 事件会禁用 MdiParent 上的 X

multithreading - Excel VBA中的原子性

android - 同一 Activity 中的多个 DatePickers

java - android.os.Bundle 无法在 libgdx Android 项目中解析

java - 类成员的最小值和最大值