0

サービス クラスから、1 つのスレッドを開始しています。スレッドクラスによってアクションが実行された場合、アクティビティに通知する最良の方法は何ですか? スレッドによって何らかのアクションが実行されたことをアクティビティ クラスに通知したいと考えています。質問は以下のコードから明確になります

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 に何かする必要があります。この状況を処理する最善の方法を誰か教えてください。

4

2 に答える 2

1

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

AHandlerを使用すると、スレッドを完全にブロックすることなく、後でキューに入れることができます。あなたの場合、これは多くの同時ダウンロードについて話している場合に役立つかもしれませんが、開始する必要はありません。

于 2013-11-08T04:55:33.653 に答える
0

まず、サービスをインテントで開始してバインドする必要はありません。どちらかで十分です。

この場合、サービスにバインドすることをお勧めします。これにより、ハンドラーとメッセンジャーを介して通信を確立する機会が得られます。ServiceConnection クラスの onServiceConnected メソッドを使用して、Service で定義された Messenger を取得できます。その方法の例については、バインドされたサービスの作成の下にあるAndroid ドキュメントを参照してください。この例では、Service インスタンスへの参照を返しますが、これを Messenger または Handler への参照に置き換える必要があります。Activity と Service の両方に Handler/Messenger があれば、やり取りするのは簡単です。バックグラウンド スレッド内にハンドラを配置する場合は、おそらくスレッドのコンストラクタで Looper.prepare() を呼び出す必要があることに注意してください。

于 2013-11-08T06:28:57.967 に答える