ОБНОВЛЕНИЕ - 2016
Лучшая альтернатива - использовать RxAndroid
(специальные привязки для RxJava
) для P
in MVP
для сбора данных.
Начните с возврата 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 в основном работает с двумя типами потоков, а именно UI thread и background thread . По документации андроид -
Не обращайтесь к инструментарию пользовательского интерфейса 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();
LOOPER
Класс, используемый для запуска цикла сообщений для потока. Темы по умолчанию делают
не иметь связанный с ними цикл сообщений; чтобы создать его, позвоните
prepare () в потоке, который должен запустить цикл, а затем loop () для
пусть он обрабатывает сообщения до тех пор, пока цикл не будет остановлен.
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 и Runnable.
связанный с MessageQueue потока.
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;
}
});