174

私は Android が初めてで、UI スレッドを使用しようとしているので、簡単なテスト アクティビティを作成しました。しかし、ボタンをクリックしてもアプリが応答しなくなったため、何かを誤解していると思います

public class TestActivity extends Activity {

    Button btn;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runThread();
            }
        });
    }

    private void runThread(){
        runOnUiThread (new Thread(new Runnable() {  
            public void run() {
                while(i++ < 1000){
                    btn.setText("#"+i);
                    try {
                        Thread.sleep(300);
                    } 
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
             }
        }));
    }
}
4

13 に答える 13

226

runThread以下は、関数の修正されたスニペットです。

private void runThread() {

    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            btn.setText("#" + i);
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}
于 2012-06-21T14:29:38.497 に答える
98

関数としてラップし、バックグラウンド スレッドからこの関数を呼び出します。

public void debugMsg(String msg) {
    final String str = msg;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mInfo.setText(str);
        }
    });
}
于 2015-01-16T20:56:04.170 に答える
28

あなたはそれを前後に持っています。ボタンをクリックすると が呼び出されますrunOnUiThread()が、クリック ハンドラーは既に UI スレッドで実行されているため、これは必要ありません。次に、コードがrunOnUiThread()新しいバックグラウンド スレッドを起動し、そこで UI 操作を実行しようとすると失敗します。

代わりに、クリック ハンドラからバックグラウンド スレッドを直接起動してください。btn.setText()次に、 への呼び出しを への呼び出しの中にラップしますrunOnUiThread()

于 2012-06-21T14:24:31.143 に答える
16
runOnUiThread(new Runnable() {
                public void run() {
                //Do something on UiThread
            }
        });
于 2015-11-04T20:15:55.697 に答える
11

フラグメントで使用する場合は、単に次のように記述します

getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Do something on UiThread
    }
});
于 2019-03-15T10:32:48.193 に答える
1

用途fragment:

requireActivity().runOnUiThread(() -> {
//your code logic
});

用途activity:

runOnUiThread(() -> {
//your code logic
});

runOnUiThreadは、UI をバックグラウンド スレッドで更新できるようにするために使用されます。詳細: https://www.tutorialspoint.com/how-do-we-use-runonuithread-in-android

于 2022-01-28T15:22:46.650 に答える
0

このサンプルから使用できます:

次の例では、この機能を使用して、バックグラウンド スレッドによって処理された類義語検索の結果を公開します。

OnCreate アクティビティ コールバック中に目標を達成するために、作成されたスレッドで searchTask を実行するように onClickListener を設定します。

ユーザーが [検索] ボタンをクリックすると、R.id.wordEt EditText に入力された単語を検索し、スレッドを開始して Runnable を実行する Runnable 匿名クラスを作成します。

検索が完了したら、Runnable SetSynonymResult のインスタンスを作成して、UI スレッドを介してシノニム TextView に結果を発行します。

この手法は、特に Activity インスタンスにアクセスできない場合に、最も便利な手法ではない場合があります。したがって、次の章では、バックグラウンド コンピューティング タスクから UI を更新するための、よりシンプルでクリーンな手法について説明します。

public class MainActivity extends AppCompatActivity {

    class SetSynonymResult implements Runnable {
        String synonym;

        SetSynonymResult(String synonym) {
            this.synonym = synonym;
        }

        public void run() {
            Log.d("AsyncAndroid", String.format("Sending synonym result %s on %d",
                    synonym, Thread.currentThread().getId()) + " !");
            TextView tv = (TextView) findViewById(R.id.synonymTv);
            tv.setText(this.synonym);
        }
    }

    ;

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

        Button search = (Button) findViewById(R.id.searchBut);
        final EditText word = (EditText) findViewById(R.id.wordEt);
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Runnable searchTask = new Runnable() {
                    @Override
                    public void run() {
                        String result = searchSynomim(word.getText().toString());
                        Log.d("AsyncAndroid", String.format("Searching for synonym for %s on %s",
                                word.getText(), Thread.currentThread().getName()));
                        runOnUiThread(new SetSynonymResult(result));
                    }
                };
                Thread thread = new Thread(searchTask);
                thread.start();
            }
        });

    }

    static int i = 0;

    String searchSynomim(String word) {
        return ++i % 2 == 0 ? "fake" : "mock";
    }
}

出典

非同期アンドロイド プログラミング ヘルダー バスコンセロス

于 2016-10-27T06:46:24.423 に答える
0

これは私がそれを使用する方法です:

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                //Do something on UiThread
            }
        });
于 2016-12-26T01:22:09.557 に答える