Die Aktualisierung der Benutzeroberfläche, die außerhalb der Haupt-thread
Ich bin Total neu auf android und wollen einfach nur wissen, ob es alle arbeiten und die Möglichkeit zum aktualisieren der Benutzeroberfläche außerhalb der Haupt-thread. Nur von meinem code habe ich unten aufgelistet ich weiß, dass aus diesem code; Es ist überhaupt nicht möglich. Aber die Sache ist ich will einfach nur die Aktualisierung der Benutzeroberfläche mit einem anderen thread. Bitte helfen Sie mir vielen Dank im Voraus!
package com.example.app;
import java.util.Random;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button b;
public ImageView I1;
public ImageView I2;
public ImageView I3;
public ImageView I4;
public TextView T;
public TextView s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
I1=new ImageView(this);
I1=(ImageView) findViewById(R.id.imag1);
I1.setVisibility(View.INVISIBLE);
I2=new ImageView(this);
I2=(ImageView) findViewById(R.id.imag2);
I2.setVisibility(View.INVISIBLE);
I3=new ImageView(this);
I3=(ImageView) findViewById(R.id.imag3);
I3.setVisibility(View.INVISIBLE);
I4=new ImageView(this);
I4=(ImageView) findViewById(R.id.imag4);
I4.setVisibility(View.INVISIBLE);
T=(TextView)findViewById(R.id.time);
s=(TextView)findViewById(R.id.score);
Thread t=new Thread(new MyThread());
t.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class MyThread implements Runnable{
Random randomGenerator = new Random();
int n;
public void run(){
while(true){
n=randomGenerator.nextInt(8);
if(n==1){
I1.setVisibility(View.VISIBLE);
}
if(n==2){
I2.setVisibility(View.VISIBLE);
}
if(n==3){
I3.setVisibility(View.VISIBLE);
}
if(n==4){
I4.setVisibility(View.VISIBLE);
}
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.getStackTrace();
}
}
}
}
}
- Lesen Sie mehr über android-und multithreading, code hat design-Fehler. Der UI sollte nicht aktualisiert werden, die von einem anderen thread, dass der Haupt-thread, das würden Sie wissen, wenn Sie sich die Mühe gemacht hätte die Dokumentation zu Lesen. Allerdings bietet android-tools für Sie in der Lage sein, um die Aktualisierung der Benutzeroberfläche von oders schicken, die von anderen threads, aber Sie haben, Lesen Sie die Dokumentation, um herauszufinden, wie.
- können Sie mir bitte den link zur entsprechenden Dokumentation?
- Hier, um zu beginnen mit: Prozesse und Threads
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Aktivität.runOnUiThread
Können Sie nicht aktualisieren Sie UI, die direkt aus nicht-UI-thread, aber Man könnte die Kommunikation mit UI-thread Handler-Objekt oder AsyncTask Objekt. Die bequemsten Weg, um AsyncTask:
Sorry wenn einige Fehler in der Methode Namen.
Lesen http://developer.android.com/guide/components/processes-and-threads.html für details.
Einen worker-thread kann nie update main-thread, da nur Haupt-thread machen kann das UI-Elemente (TextView, EditText etc..) und wenn wir versuchen, zu aktualisieren, dass wir gehen, um eine Ausnahme.
Sonst können Sie post-Methode der View-Klasse
müssen Sie eine Handler-Instanz und verwenden die post-Methode, die einen Thread innerhalb der queue des UI-Threads. Wenn Sie innerhalb einer Aktivität, die Sie verwenden können, runOnUiThread das ist ein "shortcut" zu tun, die gleiche Sache
Nur Haupt-thread update UI. Wenn dein thread aktualisieren möchten, UI, verwenden Sie die Aktivität.runOnUiThread()
Aber deine Aktion ist einfach in der Warteschlange für die Ausführung im UI-thread(wenn Sie es nicht von den UI-thread), was bedeutet, es kann update-UI ein bisschen später.
http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Lauffähig ist)