Вызов Основной поток из вторичной темы в Android

Как вызвать Основной поток из вторичного потока в Android?

Ответ 1

Самый простой способ - вызвать runOnUiThread (...) из вашего потока

activity.runOnUiThread(new Runnable() {
    public void run() {
        ... do your GUI stuff
    }
});

Ответ 2

Моя рекомендация обмениваться потоками в одном процессе - это отправлять сообщения между этими потоками. Очень легко управлять этой ситуацией с помощью Handlers:

http://developer.android.com/reference/android/os/Handler.html

Пример использования документации Android для обработки дорогостоящей работы из потока ui:

public class MyActivity extends Activity {

    [ . . . ]
    // Need handler for callbacks to the UI thread
    final Handler mHandler = new Handler();

    // Create runnable for posting
    final Runnable mUpdateResults = new Runnable() {
        public void run() {
            updateResultsInUi();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        [ . . . ]
    }

    protected void startLongRunningOperation() {

        // Fire off a thread to do some work that we shouldn't do directly in the UI thread
        Thread t = new Thread() {
            public void run() {
                mResults = doSomethingExpensive();
                mHandler.post(mUpdateResults);
            }
        };
        t.start();
    }

    private void updateResultsInUi() {

        // Back in the UI thread -- update our UI elements based on the data in mResults
        [ . . . ]
    }
}

Ответ 3

Вам понадобится Handler, который передает информацию обратно в основной поток.

Ответ 4

Также хорошо помнить, что если вы получите дополнительный поток через AsyncTask, вы можете вызвать onProgressUpdate(), onPostExecute() и т.д., чтобы выполнять работу над основным потоком.

Ответ 5

Пример кода с помощью HandlerThread

public class MainActivity extends AppCompatActivity {

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

        final Handler responseHandler = new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                //txtView.setText((String) msg.obj);
                Toast.makeText(MainActivity.this,
                        "Result from UIHandlerThread:"+(int)msg.obj,
                        Toast.LENGTH_LONG)
                        .show();
            }
        };

        HandlerThread handlerThread = new HandlerThread("UIHandlerThread"){
            public void run(){
                /* Add your business logic to pupulate attributes in Message
                   in place of sending Integer 5 as in example code */
                Integer a = 5;
                Message msg = new Message();
                msg.obj = a;
                responseHandler.sendMessage(msg);
                System.out.println(a);
            }
        };
        handlerThread.start();

    }

}

Объяснение:

  • В приведенном выше примере HandlerThread опубликуйте Message в Handler потока пользовательского интерфейса, который был инициализирован Looper потока пользовательского интерфейса.

    final Handler responseHandler = new Handler(Looper.getMainLooper())
    
  • responseHandler.sendMessage(msg); отправляет Message из HandlerThread в поток пользовательского интерфейса Handler.

  • handleMessage обрабатывает Message, полученный на MessageQueue, и показывает тост в потоке пользовательского интерфейса.