2

ActivityA と ActivityB の 2 つのアクティビティがあります。ActivityA は、長時間実行されるプロセス (Web 上のデータの取得など) を開始します。ユーザーはいつでも ActivityB に進むことを決定できます。長期実行プロセスが終了するとすぐに、その結​​果が ActivityA または ActivityB (その時点でアクティブな方) 内に表示されます。

これを実装するために、ActivityA にワーカー スレッドを作成します。ActivityA と ActivityB は両方ともLocalBroadcastManager、長時間実行プロセスの終了を通知され、その結果を取得するために に依存しています。

この実装は機能しているように見えますが、いくつかのコーナー ケースが欠けているのではないかと思います。IntentServiceここ SO では、AsyncTask、、 についての議論が見られるHandlerThreadので、私のアプローチが単純すぎるのではないかと心配しています。私はこれを正しい方法でやっていますか?そうでない場合、何が欠けていますか?

私の質問を説明するためのコードスニペットを次に示します。

アクティビティ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);
    }

}

活動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));
    }
}
4

2 に答える 2

0

私の提案は、スレッドのサービスまたはフラグメントに基づくアクティビティのモデルが 1 つあるセットアップについて考えることです。アクティビティ A にスレッドがあり、B に進むと、スレッドの制御が失われるためです。そして、このシナリオは避けるべきです。

私が言ったように、モデルといくつかのビューがあり、モデルにアクセスしていつでもスレッドを制御できます。

于 2013-09-08T19:57:44.093 に答える