업데이트-2016
가장 좋은 대안은 데이터를 처리하기 위해 RxAndroid
(에 대한 특정 바인딩 RxJava
)을 사용하는 것 P
입니다 MVP
.
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
나는 내가 조금 늦었다는 것을 알고 있지만 여기에 간다. 안드로이드는 기본적으로 UI 스레드 와 백그라운드 스레드의 두 가지 스레드 유형에서 작동 합니다 . 안드로이드 문서에 따르면-
이 문제를 해결하기 위해 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();
자벌레
스레드에 대한 메시지 루프를 실행하는 데 사용되는 클래스입니다. 스레드에는 기본적으로 메시지 루프가 없습니다. 하나를 만들려면 루프를 실행할 스레드에서 Preparing ()를 호출 한 다음 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를 사용하면 사용자 인터페이스에서 비동기 작업을 수행 할 수 있습니다. 작업자 스레드에서 차단 작업을 수행 한 다음 사용자가 스레드 및 / 또는 처리기를 직접 처리하지 않고도 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 및 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;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
필수runOnUiThread()
또는Context
변수 가 아니며 모든 루틴이 사라졌습니다! 단지 호출Toaster.toast(R.string.my_msg);
여기에 예입니다 github.com/shamanland/xdroid-toaster-example