UPDATE - 2016
Die beste Alternative ist die Verwendung RxAndroid
(spezifische Bindungen für RxJava
) für den P
in MVP
fo Daten zu übernehmen.
Kehren Sie zunächst von Observable
Ihrer vorhandenen Methode zurück.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Verwenden Sie dieses Observable wie folgt -
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Ich weiß, ich bin etwas spät dran, aber jetzt geht es los. Android funktioniert grundsätzlich mit zwei Thread-Typen, nämlich UI-Thread und Hintergrund-Thread . Laut Android-Dokumentation -
Greifen Sie nicht von außerhalb des UI-Threads auf das Android UI-Toolkit zu, um dieses Problem zu beheben. Android bietet verschiedene Möglichkeiten, von anderen Threads aus auf den UI-Thread zuzugreifen. Hier ist eine Liste von Methoden, die helfen können:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Nun gibt es verschiedene Methoden, um dieses Problem zu lösen.
Ich werde es anhand eines Codebeispiels erklären:
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Klasse zum Ausführen einer Nachrichtenschleife für einen Thread. Threads sind standardmäßig keine Nachrichtenschleife zugeordnet. Um eine zu erstellen, rufen Sie prepare () in dem Thread auf, der die Schleife ausführen soll, und dann loop (), damit Nachrichten verarbeitet werden, bis die Schleife gestoppt wird.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
AsyncTask
Mit AsyncTask können Sie asynchrone Arbeiten an Ihrer Benutzeroberfläche ausführen. Es führt die Blockierungsvorgänge in einem Arbeitsthread aus und veröffentlicht dann die Ergebnisse im UI-Thread, ohne dass Sie Threads und / oder Handler selbst behandeln müssen.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Handler
Mit einem Handler können Sie Nachrichten- und ausführbare Objekte senden und verarbeiten, die der MessageQueue eines Threads zugeordnet sind.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
, es ist nicht erforderlichrunOnUiThread()
oderContext
variabel, alle Routine ist weg!Toaster.toast(R.string.my_msg);