0

これは、メイン/UI スレッドでメソッドを呼び出すことができるという問題ではなく、瞬時に呼び出すことができるという問題です。

UI レスポンシブ要件のため、通常、UI スレッドと直接対話することは許可されていません。その場合、メイン スレッドに対する要求をキューに入れるシステムを配置することは理にかなっています。ルーパー、ハンドラーなどを備えたそのシステムがあります。

これが私がやったことです:バックグラウンドスレッドでいくつかのタスクを実行し、条件が満たされるとすぐにメインスレッドを親密にしたい(リスナーを作成しました)、応答ハンドラーを使用して投稿します..何かこれ:

if(mNoOfPendingRequests >= mNoOfRequestsConsideredEnough){
            mShouldFlagEnoughRequestsAtATime = true;
            Log.i("ThumbnailDownloader: ","Enough Requests Queued");
            //Now inform about this to PhotoGallery right now
            mResponseHandler.postAtFrontOfQueue(new Runnable() {
                public void run() {
                    mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime);
                }
            });
        }
        else{
            mShouldFlagEnoughRequestsAtATime = false;
            mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime);
        }

すでに送信された十分なリクエストについて PhotoGallery に通知しないと、PhotoGallery はますます多くのリクエストを送信し続け、アプリは応答しなくなります。

また、リクエストはキューに入れられ、後で実行されるため、リクエストが多すぎます。

したがって、私の質問は次のとおりです。

バックグラウンド スレッドからほぼ瞬時に UI スレッドでメソッド/通知を呼び出す方法はありますか?

4

5 に答える 5

1

これを行うUIスレッドで物事を実行できます:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // put your code here :)
    }
});
于 2016-08-27T17:22:14.797 に答える
0

はい、アクティビティ コンテキストを使用して呼び出すことができます

runOnUiThread()実行可能なオブジェクトを渡し、run() メソッド内にコードを記述します。

于 2016-08-27T17:35:54.860 に答える
0

あなたのコードからは明らかではありませんonEnoughRequestsQueued。リクエストの送信を停止する必要があることを投稿スレッドに伝えるだけの場合は、おそらく単純な方法で同じことを達成できますvolatile boolean

変数が true で、バックグラウンド スレッドがそれを true に設定し、変数が true のときに、リクエストをキューに入れるスレッドが停止した場合は、問題ありvolatileません。

于 2016-08-27T17:37:18.963 に答える