2017-04-07 54 views
1

我正在使用RXJava 2.在subscribe方法中的一些邏輯之後,我想刪除一個使用過的文件。我想我應該在onComplete這樣做。但我不能通過我的File對象。 我的代碼: 問題:RXJava將值傳入onComplete

Observer<Bitmap> observer = new Observer<Bitmap>() { 
    @Override 
    public void onSubscribe(Disposable d) { 
    } 

    @Override 
    public void onNext(Bitmap bitmap) { 
     if(mImageView.getTag().toString().equals(TAG)) { 
      mImageView.setImageBitmap(bitmap); 
     } 
    } 

    @Override 
    public void onError(Throwable e) { 
    } 

    @Override 
    public void onComplete() { 
     //   outputFile.delete(); 
    } 
}; 

Observable<Bitmap> observable = Observable.create(new ObservableOnSubscribe<Bitmap>() { 
    @Override 
    public void subscribe(ObservableEmitter<Bitmap> e) throws Exception { 
     File outputFile = new File(newTAG); 
     // do some stuff with a file 
     Bitmap bitmap = decodeSampledBitmapFromUrl(newTAG, width, height); 
     e.onNext(bitmap); 
     // now I need to delete a file 
     e.onComplete(); 
     } 
    } 
); 
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(observer); 
  1. 如何通過一個outputFileonComplete
  2. 有沒有辦法在一個事件或少量代碼中創建observable和subcride?
+0

1)使用元組類型並將文件存儲在您的觀察者中。 2)可以將常見代碼分解爲方法,但除此之外,您始終爲Observable創建1個實例,爲Observer創建1個實例。 – akarnokd

+0

如果我在onComplete方法裏面刪除我的文件,它會在主線程中執行嗎? – Rainmaker

回答

3
  1. 你不能傳遞對象onComplete(),作爲onComplete()沒有價值,這是一個信號流的目的,並沒有更多的項目將被髮出。
    你可以通過它在onNext()傳遞它每個發射(即包含2個對象與元組,如@akarnokd建議),並在那裏刪除它。

  2. 您可以簡單地使用匿名方法編寫所有的代碼,如果您使用lambda表達式,它將刪除更多的boiler-plate代碼。

  3. 如果您將刪除文件onCompleted它確實將在主線程中執行,如您在observerOn()中指定的那樣。

無論如何,你不必做的onCompleted()事件,只是刪除它的申購代碼(創建方法)你已經提取的位圖到內存後,用戶不應該知道或關心如何提取Bitmap。此外,您可以使用fromCallable(),這意味着將其包含在執行所有操作的方法中。總結它:

Observable.fromCallable(() -> { 
     File outputFile = new File(newTAG); 
     // do some stuff with a file 
     Bitmap bitmap = decodeSampledBitmapFromUrl(newTAG, width, height); 
     // be sure to handle properly exceptions for ensure file will be closed 
     outputFile.delete(); 
     return bitmap; 
    }) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(bitmap -> { 
         if (mImageView.getTag().toString().equals(TAG)) { 
          mImageView.setImageBitmap(bitmap); 
         } 
        }, 
        throwable -> { 
         //handle error 
        }); 
0

您可以使用接口,而不是在onComplete()或onNext()執行操作。

創建界面

public interface OnActionComplete { 
    void onComplete(); 
} 

實現它在你的活動或片段

public class YourActivity extends BaseActivity implements OnActionComplete { 
    @Override 
    public void onComplete() { 
     //perform your action 
    } 
} 

現在只是調用該方法對你的任務就像onNext完成。

@Override 
public void onNext(Bitmap bitmap) { 
    if(mImageView.getTag().toString().equals(TAG)) { 
     mImageView.setImageBitmap(bitmap); 

     activityInstance.onComplete(); // this will trigger onComplete() method of interface. 
    } 
}