"Ansicht aktualisieren", bei runtime in Android
Das Beispiel ist ziemlich einfach: ich will, damit der Benutzer wissen über das, was die app macht, indem Sie nur mit einem text (canvas.drawText()). Dann, meine erste Nachricht wird angezeigt, aber nicht die anderen. Ich meine, ich habe ein "setText" Methode aber es funktioniert nicht für updates.
onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(splash); //splash is the view class
loadResources();
splash.setText("this");
boundWebService();
splash.setText("that"):
etc();
splash.setText("so on");
}
Ansicht-text-Zeichnung-arbeiten mit einem drawText in onDraw();, also setText ändert den text zeigt es aber nicht.
Jemand mich empfohlen ersetzt anzeigen mit einer SurfaceView, aber es würde viel Mühe, nur für ein paar updates, ALSO... wie zum Teufel kann ich die Ansicht aktualisieren dinamically zur Laufzeit?
Sollte es Recht einfach sein, nur mit einem text für 2 Sekunden zu sagen, und dann den main thread zu tun, seine Sachen und dann die Aktualisierung der text...
Dank!
Update:
Habe ich versucht umzusetzen-handler.onPost(), aber es ist die gleiche Geschichte über und über wieder. Lassen Sie mich setzen Sie den code:
public class ThreadViewTestActivity extends Activity {
Thread t;
Splash splash;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
splash = new Splash(this);
t = new Thread(splash);
t.start();
splash.setTextow("OA");
try { Thread.sleep(4000); } catch (InterruptedException e) { }
splash.setTextow("LALA");
}
}
Und:
public class Splash implements Runnable {
Activity activity;
final Handler myHandler = new Handler();
public Splash(Activity activity) {
this.activity=activity;
}
@Override
public void run() {
//TODO Auto-generated method stub
}
public synchronized void setTextow(final String textow) {
//Wrap DownloadTask into another Runnable to track the statistics
myHandler.post(new Runnable() {
@Override
public void run() {
TextView t = (TextView)activity.findViewById(R.id.testo);
t.setText(textow);
t.invalidate();
}
});
}
}
Obwohl splash ist im anderen thread, habe ich einen Schlaf auf dem Haupt-thread, ich benutze den handler zu verwalten UI und alles, es nicht verpasst eine Sache, es zeigt nur das Letzte update.
InformationsquelleAutor ferostar | 2010-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe nicht dieses noch, aber ich denke, die üblichen Muster zu tun, die die langwierige Initialisierung in einen hintergrund-thread, und verwenden Sie
Handler.post()
zum aktualisieren der Benutzeroberfläche. Sehen http://developer.android.com/reference/android/widget/ProgressBar.html für einen anderen, aber möglicherweise mit, Beispiel.Siehe auch diese Antwort, vor allem der erste Absatz:
Update (bezogen auf dein update und dein Kommentar): Sie sollen sich nicht um die Aktualisierung der Benutzeroberfläche in jedem thread, außer dem einen, wo ist Ihre Tätigkeit erstellt. Warum ist es unmöglich für Sie, laden Sie Ihre Ressourcen in einem hintergrund-thread?
InformationsquelleAutor Dan Breslau
Erste:
onCreate
ausgeführt wird, auf Haupt-UI-thread der Anwendung, also keine UI-updates, bis Sie es verlassen. Im Prinzip muß man einen thread für die Ausführung von lang Laufenden Aufgaben und einen Mechanismus, mit push-Aktualisierungen in der Benutzeroberfläche.Die meisten üblichen Ansatz zu erweitern AsyncTask sehen dieser link für weitere info
InformationsquelleAutor Nikolay Ivanov
nehme ich an, dass Ihrer Ansicht ist eine erweiterte Sicht, und Sie rufen onDraw für die Erstellung der view, also, vielleicht die Ansicht nicht 'aktualisieren' Ihres Staates, so versuchen Sie, diese
gut, nun statt der Zeichnung der ersten die Ansicht zeichnen auch die Letzte Ihrer Operationen (loadResources()...usw) zu schnell laufen? legen Sie ein Protokoll an.ich() Eintrag auf deiner draw-Methode, um zu sehen, was text ist das zeichnen, ich nehme an, dass die Ansicht zeichnen alle Texte...
Nichts zeigt in logcat obwohl ich in Log.ich(splashText) innerhalb von onDraw.
InformationsquelleAutor Franco