更新- 2016
最好的替代方案是使用RxAndroid(针对RxJava的特定绑定)让MVP中的P负责数据。
首先从你现有的方法返回Observable。
private Observable<PojoObject> 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<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线程和后台线程。根据android文档-
不要从UI线程外部访问Android UI工具包来解决这个问题,Android提供了几种从其他线程访问UI线程的方法。下面是一些可以帮助你的方法:
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();
电影
用于为线程运行消息循环的类。线程默认执行
没有与它们关联的消息循环;要创建一个,请调用
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允许您对用户执行异步工作
接口。它在工作线程中执行阻塞操作
然后在UI线程上发布结果,而不需要你这样做
自己处理线程和/或处理程序。
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对象
与线程的messagqueuue相关联。
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;
}
});