2015-12-02 184 views
0

我今天潛入RxJava。需要幫助將AsyncTask轉換爲RxJava

我有一個AsyncTask將圖像轉換爲位圖並將其設置爲Imageview。

我想是我的AsyncTask轉換爲RxJava

這是我下面的工作的AsyncTask:

String imageurl = "http://example.com/image.jpg"; 

new AsyncTask<String, Void, Void>() { 
      Bitmap theBitmap = null; 
      @Override 
      protected Void doInBackground(String... params) { 
       String TAG = "Message: "; 

       try { 
        theBitmap = Glide. 
          with(mContext). 
          load(mValues.get(params[0]). 
          asBitmap(). 
          into(-1, -1). 
          get(); 

       } catch (final ExecutionException e) { 
        Log.e(TAG, e.getMessage()); 
       } catch (final InterruptedException e) { 
        Log.e(TAG, e.getMessage()); 
       } catch (final NullPointerException e) { 
        Log.e(TAG, e.getMessage()); 
       } 
       return null; 
      } 
      @Override 
      protected void onPostExecute(Void dummy) { 
       if (null != theBitmap) { 
        ImageView mImageView = (ImageView) findViewById(R.id.image); 
        mImageView.setImageBitmap(theBitmap); 
       } 
      } 
     }.execute(imageurl); 

我知道我想提供我已經試過代碼,但我想有問題把我的頭圍繞RxJava。我只是需要一些開始。

我看到這個示例代碼,使用只要它將整數傳遞給onNext()函數。 http://reactivex.io/documentation/operators/just.html

Observable.just(1, 2, 3) 
      .subscribe(new Subscriber<Integer>() { 
     @Override 
     public void onNext(Integer item) { 
      System.out.println("Next: " + item); 
     } 

     @Override 
     public void onError(Throwable error) { 
      System.err.println("Error: " + error.getMessage()); 
     } 

     @Override 
     public void onCompleted() { 
      System.out.println("Sequence complete."); 
     } 
    }); 

請,我怎麼可以把這段代碼轉換,所以我可以用它喜歡的AsyncTask

+0

您需要在文檔中進一步介紹如何創建可觀察性的部分 – njzk2

回答

2

類似這樣的:

mSubscription = Observable.defer(new Func0<Observable<Bitmap>>() { 
    @Override 
    public Observable<Bitmap> call() { 
     return Observable.just(getBitmap(imageurl)); 
    } 
}) 
     .filter(new Func1<Bitmap, Boolean>() { 
      @Override 
      public Boolean call(Bitmap bitmap) { 
       return bitmap != null; 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<Bitmap>() { 
      @Override 
      public void onCompleted() {} 

      @Override 
      public void onError(Throwable throwable) { 
       Log.e(TAG, e.getMessage()); 
      } 

      @Override 
      public void onNext(Bitmap bitmap) { 
       ImageView mImageView = (ImageView) findViewById(R.id.image); 
       mImageView.setImageBitmap(bitmap); 
      } 
     }); 

/* later in onDestroy(), onStop(), etc */ 
if (mSubscription != null && !mSubscription.isUnsubscribed()) { 
    mSubscription.unsubscribe(); 
} 
+0

難道你不能使用lambda表達式...我還不熟悉,我想如何將我的字符串作爲參數傳遞給getBitmap()方法? –

+0

@HtmlTosin更新; 'gitBitmap()'只是一個放置你的Glide特定邏輯的地方 – AndroidEx

+0

嗨,它的工作,但然後我不得不刪除「mSubscription」變量,並將其作爲「Observable.defer」使用......它說「找不到符號'mSubscription'「。爲什麼呢? –