2017-05-18 53 views
0

我做了這個可觀測到壓縮位圖:如何在Observable完成時返回值?

public static Uri compressBitmapInBackground(Bitmap original, Context context) 
{ 
    Uri value; 
    Observable.create((ObservableOnSubscribe<Uri>) e -> 
    { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     original.compress(Bitmap.CompressFormat.JPEG, 100, out); 
     Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); 
     String path = MediaStore.Images.Media.insertImage(context.getContentResolver(),decoded, "Title", null); 
     Log.d("pathCompress",path); 
     Uri uriPath = Uri.parse(path); 

     e.onNext(uriPath); 
     e.onComplete(); 
    }).subscribeOn(Schedulers.computation()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(x-> System.out.print(x)); 


    //how to return x when observable is complete? 
} 

我的問題是,我想要的可觀測完畢時,返回的結果:有沒有辦法做到這一點?因爲我可以在onNext()函數中調用演示者,但我更願意避免它。

謝謝

回答

1

我認爲你在混合關注。我的概念分成:

public static Uri compressBitmap(Bitmap original, Context context) { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    original.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); 
    String path = MediaStore.Images.Media.insertImage(context.getContentResolver(),decoded, "Title", null); 
    Log.d("pathCompress",path); 
    Uri uriPath = Uri.parse(path); 
} 

然後,只需使用此方法可觀察流量:

Observable 
.from(...) 
.map(foo -> getBitmap(bar)) 
.observeOn(Schedulers.computation()) 
.map(bitmap -> compressBitmap(bitmap,context)) 
.doOnNext(url -> dowhatever(url)) 

這樣一來,你有做一件事(壓縮位圖)一個單一的方法,並且您可以在可觀察的鏈中使用它,而不會迷失細節或切換線程多次。

+0

有趣......我已經讓最後一段代碼只用於製作可重用代碼,但我只能重用函數並在每個需要的類中實現Observable。 – ste9206

+0

確切地說 - 因爲在每種情況下都存在不同的需求(要壓縮多少位圖以及更新顯示的頻率,在線/離線/後臺處理等),通常最好是製作自包含的流程,然後將它們綁定一起在您需要使用它們的每個位置。 –

+0

非常感謝你 – ste9206