Wie man runOnUiThread benutzt

Ich lerne, etwas in UI-Thread zu tun, also habe ich einfache Testaktivität geschrieben. Aber ich glaube, ich habe etwas falsch verstanden, denn wenn ich auf die Schaltfläche klicke, ist die App nicht mehr resitiert

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

  • "Content-Ansicht noch nicht erstellt" auf Android-Fragmenten
  • Fehler: Fehler beim Analysieren von XML: nicht gut geformt (ungültiges Token) ...?
  • Wie benutzt man ItemAnimator in einem RecyclerView?
  • Kann ich Visual Studio verwenden, um Android-Anwendungen in HTML5 zu erstellen?
  • Realm findFirst () -Methode gibt null zurück
  • Android Appcompat v21 - Verwenden Sie alte Spinner-Stil
  • Position Independent Executables und Android Lollipop
  • Android Studio Espresso Testing Error: Leere Test Suite
  • Berechnen Sie PPI von Android Device
  • Verschlüsseln und Entschlüsseln mit AES EZB-Modus 'BadPaddingException' in einigen Fällen
  • "Fehler beim Aufblasen der Klasse Fragment" mit Google Map
  • Kann jemand diesen Java-Code erklären
  • 8 Solutions collect form web for “Wie man runOnUiThread benutzt”

    Unten ist korrigiert Snippet von runThread Funktion.

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

    Wenden Sie es einfach als Funktion an und rufen Sie diese Funktion aus Ihrem Hintergrund-Thread.

     public void debugMsg(String msg) { final String str = msg; runOnUiThread(new Runnable() { @Override public void run() { mInfo.setText(str); } }); } 

    Sie haben es von hinten nach vorne. Ihr Button-Klick führt zu einem Aufruf von runOnUiThread() , aber das wird nicht benötigt, da der Klick-Handler bereits auf dem UI-Thread läuft. Dann startet Ihr Code in runOnUiThread() einen neuen Hintergrund-Thread, wo Sie versuchen, UI-Operationen zu tun, die dann fehlschlagen.

    Stattdessen starten Sie einfach den Hintergrund-Thread direkt aus Ihrem Klick-Handler. Dann wickeln Sie die Anrufe an btn.setText() innerhalb eines Aufrufs auf runOnUiThread() .

     runOnUiThread(new Runnable() { public void run() { //Do something on UiThread } }); 

    Es gibt mehrere Techniken, die von runOnUiThread () verwenden, können alle sehen

    Dies ist mein Haupt-Thread (UI-Thread) namens AndroidBasicThreadActivity und ich werde es von einem Worker-Thread auf verschiedene Arten zu aktualisieren –

     public class AndroidBasicThreadActivity extends AppCompatActivity { public static TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_android_basic_thread); textView = (TextView) findViewById(R.id.textview); MyAndroidThread myTask = new MyAndroidThread(AndroidBasicThreadActivity.this); Thread t1 = new Thread(myTask, "Bajrang"); t1.start(); } } 

    1.) Durch die Übergabe von Activity's Instanz als Argument auf Worker Thread

     class MyAndroidThread implements Runnable { Activity activity; public MyAndroidThread(Activity activity) { this.activity = activity; } @Override public void run() { activity.runOnUiThread(new Runnable() { @Override public void run() { AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread."); } }); } } 

    2.) Durch die Verwendung von View's Post (Runnable runnable) Methode in Worker Thread

     class MyAndroidThread implements Runnable { Activity activity; public MyAndroidThread(Activity activity) { this.activity = activity; } @Override public void run() { AndroidBasicThreadActivity.textView.post(new Runnable() { @Override public void run() { AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread."); } }); } } 

    3.) Durch die Verwendung von Handler-Klasse aus android.os-Paket Wenn wir nicht den Kontext haben (this / getApplicationContext ()) oder Activity-Instanz (AndroidBasicThreadActivity.this), dann müssen wir die Handler-Klasse als unten verwenden –

     class MyAndroidThread implements Runnable { Activity activity; public MyAndroidThread(Activity activity) { this.activity = activity; } @Override public void run() { new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread."); } }); } } 

    Sie können aus diesem Beispiel:

    Im folgenden Beispiel werden wir diese Möglichkeit nutzen, um das Ergebnis aus einer Synonym-Suche zu veröffentlichen, die von einem Hintergrund-Thread verarbeitet wurde.

    Um das Ziel während des OnCreate-Aktivitäts-Callbacks zu erreichen, richten wir onClickListener ein, um searchTask auf einem erstellten Thread auszuführen.

    Wenn der Benutzer auf die Schaltfläche "Suchen" klickt, erstellen wir eine anonyme Runnable-Klasse, die nach dem in R.id.wordEt EditText eingegebenen Wort sucht und den Thread startet, um Runnable auszuführen.

    Wenn die Suche abgeschlossen ist, erstellen wir eine Instanz von Runnable SetSynonymResult, um das Ergebnis auf dem Synonym TextView über den UI-Thread zu veröffentlichen.

    Diese Technik ist irgendwann nicht die bequemste, besonders wenn wir keinen Zugriff auf eine Activity-Instanz haben; Daher werden wir in den folgenden Kapiteln einfachere und sauberere Techniken besprechen, um die Benutzeroberfläche von einer Hintergrundrechnungsaufgabe zu aktualisieren.

     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"; } } 

    Quelle :

    Asynchrone android programmierung Helder Vasconcelos

    So benutze ich es

     runOnUiThread(new Runnable() { @Override public void run() { //Do something on UiThread } }); 

    Thy dieses:

     @UiThread public void logMsg(final String msg) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Log.d("UI thread", "I am the UI thread"); } }); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.