最好的选择是使用RxAndroid(用于特异性结合RxJava)用于P在MVP给负责FO数据。
首先Observable从现有方法返回。private Observable getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});}
像这样使用这个Observable -getObservableItems().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}});}
-------------------------------------------------- -------------------------------------------------- ------------------------------
我知道我有点晚了但是这里去了。Android基本上适用于两种线程类型,即UI线程和后台线程。根据android文档 -不要从UI线程外部访问Android UI工具包来解决此问题,Android提供了几种从其他线程访问UI线程的方法。以下列出了可以提供帮助的方法:Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long)
现在有各种方法可以解决这个问题。
我将通过代码示例解释它:
runOnUiThreadnew 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(),然后循环()让它处理消息,直到循环停止。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();
}}
的AsyncTaskAsyncTask允许您在用户界面上执行异步工作。它在工作线程中执行阻塞操作,然后在UI线程上发布结果,而不需要您自己处理线程和/或处理程序。public void onClick(View v) {
new CustomTask().execute((Void[])null);}private class CustomTask extends AsyncTask {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}}
处理器Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。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;
}});