2015-12-02 137 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'“。为什么呢? –