バックグラウンド
以下のコードは、ユーザーが画像を選択するたびに画像がアップロードされるのを防ぐことを目的としています。基本的に私の目的は、アップロードを開始する前に「クールオフ」期間を作成して、ユーザーのバッテリーとデータを節約することでした。
問題
Fragment が破棄された場合を除いて、コードは正常に機能します。 OnComplete は、最後のアイテムが発行される前にサブスクライバーのサブスクライブを解除するため、最後に選択された画像はアップロードされません。これは正しい動作だと思いますが、解決方法がわかりません。
また、運がほとんどなく、代わりdebounce
に使用する必要がありましたTakeLast
。結果は私が望んでいたものです。
AsyncSubject の方が良いかもしれませんが、今後の方法はわかりません。ありがとう。
public class MyFragment extends Fragment {
private static final int DO_STUFF_REQUEST_CODE = 123173;
private static final int DEBOUNCE_TIME = 20;
private PublishSubject<Object> startPhotoUploadPublishSubject;
@Bind(R.id.photo)
ImageView photo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startPhotoUploadPublishSubject = PublishSubject.create();
startPhotoUploadPublishSubject
.observeOn(AndroidSchedulers.mainThread())
.takeLast(DEBOUNCE_TIME, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.subscribe(new StartUploadPhotoIntentServiceSubscriber());
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
...
}
@Override
public void onDestroy() {
super.onDestroy();
startPhotoUploadPublishSubject.onCompleted();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == Crop.REQUEST_CROP) {
startPhotoUploadPublishSubject.onNext(null);
}
}
}
@OnClick(R.id.photo)
public void choosePhotoSelected() {
Intent chooserIntent = ...etc
startActivityForResult(chooserIntent, DO_STUFF_REQUEST_CODE);
}
private class StartUploadPhotoIntentServiceSubscriber extends Subscriber<Object> {
@Override
public void onCompleted() {
//do nothing
Toast.makeText(getActivity(), "ON COMPLETE", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
//we shouldnt have any errors
}
@Override
public void onNext(Object object) {
Toast.makeText(getActivity(), "ON NEXT", Toast.LENGTH_SHORT).show();
Intent uploadPhotoIntent = new Intent(
getActivity(), UploaderIntentService.class);
getActivity().startService(uploadPhotoIntent);
}
}
}