起因:無(wú)意間看到AvoidOnResult纱昧,大概就是說(shuō)瘪撇,用類似RxPermissions的方式,將原來(lái)需要在Activity里面回調(diào)的方式改成rx的方式履恩。
也就是說(shuō)锰茉,可以直接使用像下面這樣的代碼來(lái)處理onActivityResult。
AvoidOnResult(this)
.startForResult(FetchDataActivity::class.java, REQUEST_CODE_RXJAVA)
//下面可自由變換
.filter { it.resultCode == Activity.RESULT_OK }
.flatMap {
val text = it.data.getStringExtra("text")
Observable.fromIterable(text.asIterable())
}
.subscribe({
Log.d("-------> ", it.toString())
}, {
Toast.makeText(this, "error", Toast.LENGTH_SHORT).show()
}, {
Toast.makeText(this, "complete", Toast.LENGTH_SHORT).show()
})
經(jīng)過(guò):我找了一圈README切心,發(fā)現(xiàn)并沒(méi)有上傳到中央倉(cāng)庫(kù)飒筑,然后我就把代碼復(fù)制過(guò)來(lái),自己改了改绽昏,扔到了jcenter上面协屡。(申明:代碼是復(fù)制過(guò)來(lái)的,我自己改了一部分代碼之后放到了jcenter上面)全谤。
//原來(lái)的代碼
private Map<Integer, PublishSubject<ActivityResultInfo>> mSubjects = new HashMap<>();
private Map<Integer, AvoidOnResult.Callback> mCallbacks = new HashMap<>();
public Observable<ActivityResultInfo> startForResult(final Intent intent, final int requestCode) {
PublishSubject<ActivityResultInfo> subject = PublishSubject.create();
mSubjects.put(requestCode, subject);
return subject.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
startActivityForResult(intent, requestCode);
}
});
}
public void startForResult(Intent intent, int requestCode, AvoidOnResult.Callback callback) {
mCallbacks.put(requestCode, callback);
startActivityForResult(intent, requestCode);
}
//修改后的代碼
private PublishSubject<AResultMessage> mSubject;
private Disposable mDisposable;
private AResult.Callback mCallback;
public Observable<AResultMessage> startForResult(final Intent intent, final int requestCode) {
mCallback = null;
mSubject = PublishSubject.create();
return mSubject.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
mDisposable = disposable;
startActivityForResult(intent, requestCode);
}
});
}
public void startForResult(Intent intent, int requestCode, AResult.Callback callback) {
mSubject = null;
mCallback = callback;
startActivityForResult(intent, requestCode);
}
@Override
public void onDetach() {
super.onDetach();
if (mDisposable != null && !mDisposable.isDisposed())
mDisposable.dispose();
}
為什么不用map存儲(chǔ)requestCode呢肤晓?其實(shí)我們可以思考一下requestCode的作用,是為了在onActivityResult的時(shí)候進(jìn)行區(qū)分啼县,但是當(dāng)我們使用RxJava的方式時(shí)材原,已經(jīng)變成一對(duì)一的回調(diào)了,所以requestCode就算去掉都沒(méi)關(guān)系季眷。所以我們完全可以像下面這樣寫(xiě)余蟹,不用requestCode。
private AResult mResult;
mResult = new AResult(this);
//RxJava
mResult.startForResult(SecondActivity.class)
.filter(AResultMessage::isOk)
.map(AResultMessage::getData)
.subscribe(it -> Log.i("AResult", it.toString()));
//Callback
mResult.startForResult(SecondActivity.class, result -> Log.i("AResult", result.toString()));
當(dāng)然我也保留了傳入requestCode的接口子刮,以及所有的resultCode威酒,requestCode窑睁,data這些返回?cái)?shù)據(jù)。
public class AResultMessage {
private int resultCode;
private int requestCode;
private Intent data;
AResultMessage(Intent data, int resultCode, int requestCode) {
this.data = data;
this.resultCode = resultCode;
this.requestCode = requestCode;
}
public Intent getData() {
return data;
}
public int getResultCode() {
return resultCode;
}
public int getRequestCode() {
return requestCode;
}
public boolean isOk() {
return resultCode == Activity.RESULT_OK;
}
public boolean isCancel() {
return resultCode == Activity.RESULT_CANCELED;
}
public boolean isFirstUser() {
return resultCode == Activity.RESULT_FIRST_USER;
}
@Override
public String toString() {
return "AResultMessage{" +
"isOk=" + isOk() +
", isCancel=" + isCancel() +
", isFirstUser=" + isFirstUser() +
", resultCode=" + resultCode +
", requestCode=" + requestCode +
", data=" + data +
'}';
}
}
結(jié)果:GitHub
<dependency>
<groupId>com.linyuzai</groupId>
<artifactId>aresult</artifactId>
<version>1.0.3</version>
<type>pom</type>
</dependency>
compile 'com.linyuzai:aresult:1.0.3'
坑:在startActivityForResult()中葵孤,如果requestCode傳的值小于0担钮,那么不會(huì)回調(diào)到onActivityResult。