1

バックグラウンド

以下のコードは、ユーザーが画像を選択するたびに画像がアップロードされるのを防ぐことを目的としています。基本的に私の目的は、アップロードを開始する前に「クールオフ」期間を作成して、ユーザーのバッテリーとデータを節約することでした。

問題

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);
        }
    }
}
4

1 に答える 1