webentwicklung-frage-antwort-db.com.de

Rufen Sie den Haupt-Thread aus dem Sekundär-Thread in Android auf

Wie rufe ich den Haupt-Thread aus dem Sekundär-Thread in Android auf?

39
sajjoo

Der einfachste Weg ist, runOnUiThread (...) von Ihrem Thread aus aufzurufen

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

Meine Empfehlung, Threads im selben Prozess zu kommunizieren, sendet Nachrichten zwischen diesen Threads. Es ist sehr einfach, diese Situation mithilfe von Handlern zu verwalten:

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

Anwendungsbeispiel von der Android-Dokumentation bis zur Abwicklung teurer Arbeiten aus dem Ui-Thread:

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
        [ . . . ]
    }
}
23
Jesus Oliva

Denken Sie auch daran, dass Sie, wenn Sie Ihren sekundären Thread über eine AsyncTask erhalten, die Option haben, onProgressUpdate () , onPostExecute () usw. aufzurufen, um die Arbeit am Hauptthread durchzuführen.

1
Tad

Sie benötigen eine Handler, die die Informationen an den Haupt-Thread zurückgibt.

1
keyboardsurfer

Beispielcode mit 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:

  1. In obigem Beispiel stellt HandlerThread eine Message auf Handler des UI-Threads bereit, die mit Looper des UI-Thread initialisiert wurde.

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

  3. handleMessage verarbeitet Message, die auf MessageQueue empfangen wurde, und zeigt einen Toast im UI-Thread.

1
Ravindra babu