2010-12-08 8 views

Antwort

72

Der einfachste Weg ist runOnUiThread (...) von dem Thread auch

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

was ist mit via java? – jonney

+3

Was meinst du mit "via Java"? Dies ist Java – thoredge

+0

ich meine über j2se Standard Java nicht android – jonney

22

Meine Empfehlung, Threads im selben Prozess zu kommunizieren, ist das Senden von Nachrichten zwischen diesen Threads. Es ist sehr leicht, diese Situation zu bewältigen Handlers mit:

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

Anwendungsbeispiel von Android-Dokumentation, um teure Arbeit aus dem UI-Thread Handhabung:

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

Danke! Klappt wunderbar!! : D –

1

Sie werden eine Notwendigkeit Handler, die die Informationen an den Hauptthread zurückgibt.

1

zu nennen, ist es gut, sich daran zu erinnern, dass, wenn Sie Ihren sekundären Thread durch eine AsyncTask bekommen, haben Sie die Möglichkeit onProgressUpdate() anrufen , onPostExecute(), usw., um am Haupt-Thread zu arbeiten.

0

Beispielcode 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(); 

    } 

} 

Erklärung mit:

  1. In obigem Beispiel HandlerThread Posten Message auf Handler von UI-Thread, der mit Looper von UI-Thread initialisiert wurde.

    final Handler responseHandler = new Handler(Looper.getMainLooper()) 
    
  2. responseHandler.sendMessage(msg); sendet Message von HandlerThread zu UI-Thread Handler.

  3. handleMessage Prozesse Message empfangen am MessageQueue und zeigt einen Toast auf UI-Thread.

Verwandte Themen