ОНОВЛЕННЯ - 2016
Кращою альтернативою є використання RxAndroid
(конкретних прив'язок для RxJava
) для P
в , MVP
щоб взяти на себе відповідальність Fo даних.
Почніть з повернення Observable
зі свого існуючого методу.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Використовуйте спостережуване так -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Я знаю, що я трохи спізнююсь, але ось іде. Android в основному працює на двох типах потоків, а саме на потоці інтерфейсу та потоці фону . Згідно з документацією на android -
Не отримуйте доступ до набору інструментів для користувальницького інтерфейсу за межами потоку користувальницького інтерфейсу, щоб виправити цю проблему, Android пропонує кілька способів доступу до потоку інтерфейсу з інших потоків. Ось перелік методів, які можуть допомогти:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Зараз існують різні методи вирішення цієї проблеми.
Я поясню це за зразком коду:
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();
ЛОПЕР
Клас, який використовується для запуску циклу повідомлень для потоку. Нитки за замовчуванням не мають циклу повідомлень, пов’язаних з ними; щоб створити його, зателефонуйте priprema () у потоці, який має запустити цикл, а потім цикл (), щоб він обробляв повідомлення до тих пір, поки цикл не припиняється.
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
AsyncTask дозволяє виконувати асинхронні роботи на вашому користувальницькому інтерфейсі. Він виконує операції блокування в робочій нитці, а потім публікує результати в потоці інтерфейсу користувача, не вимагаючи, щоб ви самі обробляли потоки та / або обробники.
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
}
}
Обробник
Обробник дозволяє вам надсилати та обробляти об'єкти повідомлення та запуску, пов'язані з повідомленнями.
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'
, вона не потребуєrunOnUiThread()
і неContext
змінна, вся рутина пішла! просто посилайтесьToaster.toast(R.string.my_msg);
ось на приклад: github.com/shamanland/xdroid-toaster-example