อัพเดท - 2016
ทางเลือกที่ดีที่สุดคือการใช้RxAndroid
(ผูกที่เฉพาะเจาะจงสำหรับRxJava
) สำหรับP
ใน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 ด้ายและพื้นหลังด้าย ตามเอกสาร Android -
อย่าเข้าถึงชุดเครื่องมือ Android UI จากภายนอกเธรด 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();
Looper
คลาสที่ใช้เพื่อรันการวนรอบข้อความสำหรับเธรด เธรดโดยค่าเริ่มต้นไม่มีการวนรอบข้อความที่เกี่ยวข้อง ในการสร้างให้เรียกเตรียมพร้อม () ในเธรดที่จะเรียกใช้ลูปแล้วลูป () เพื่อให้มันประมวลผลข้อความจนกว่าลูปจะหยุด
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
}
}
ผู้ดำเนินการ
ตัวจัดการช่วยให้คุณสามารถส่งและประมวลผลข้อความและวัตถุที่เรียกใช้ที่เชื่อมโยงกับ 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;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
มันไม่จำเป็นต้องมีrunOnUiThread()
หรือContext
เปลี่ยนแปลงรูทีนทั้งหมดหายไป เพียงแค่เรียกToaster.toast(R.string.my_msg);
นี่คือตัวอย่าง: github.com/shamanland/xdroid-toaster-example