2010-12-08 2 views

ответ

72

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

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

как насчет через java? – jonney 2014-04-24 11:15:47

22

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

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 
     [ . . . ] 
    } 
} 
+0

Спасибо! Работает как шарм !! : D – 2013-11-22 04:36:41

1

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

1

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

0

Пример кода с использованием 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(); 

    } 

} 

Пояснение:

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

    final Handler responseHandler = new Handler(Looper.getMainLooper()) 
    
  2. responseHandler.sendMessage(msg); посылает Message от HandlerThread к UI Тема Handler.

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

Смежные вопросы