2015-08-14 13 views
5

Được rồi, vì vậy tôi gặp một chút rắc rối với RxJava Observable mà tôi đang sử dụng trong ứng dụng Android của mình. Nó là cực kỳ bực bội vì điều này đã được làm việc trong một thời bây giờ và chỉ bây giờ ném lỗi ở trên. Tôi biết rằng điều này có nghĩa là tôi đang làm một hoạt động giao diện người dùng từ một chủ đề khác nhưng tôi không thấy nơi đó đang xảy ra. Vì vậy, đây là quan sát được:RxJava Không thể tạo bộ xử lý bên trong sợi chưa được gọi là Looper.prepare()

ConnectionsList.getInstance(this).getConnectionsFromParse(mCurrentUser) 
      .delay(3, TimeUnit.SECONDS) 
      .flatMap(s -> mainData.getDataFromNetwork(this, mCurrentUser, mSimpleFacebook)) 
      .flatMap(s -> mainData.getPictureFromUrl(s)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Bitmap>() { 
       @Override 
       public void onCompleted() { 
        if (mCurrentUser.get(Constants.NAME) != null) { 
         mNavNameField.setText((String) mCurrentUser.get(Constants.NAME)); 
        } 
        mSearchFragment.setupActivity(); 
       } 

       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
        mSearchFragment.setEmptyView(); 
       } 

       @Override 
       public void onNext(Bitmap bitmap) { 
        mNavProfImageField.setImageBitmap(bitmap); 
        mainData.saveImageToParse(bitmap); //save the image to Parse backend 
       } 
      }); 

Sau khi một số lỗi tôi thấy rằng flatMap đây là nơi mà các lỗi đang xảy ra:

.flatMap(s -> mainData.getDataFromNetwork(this, mCurrentUser, mSimpleFacebook)) 

Bên trong đó là những điều sau đây, tôi đã thêm một nhận xét lỗi ở đâu đang bị ném:

return Observable.create(subscriber -> { 
      //set the username field if ParseUser is not null 
      if(currentUser != null) { 
       username = (String) currentUser.get(Constants.NAME); 
      } 

      //if prof pic is null then request from facebook. Should only be on the first login 
      if (currentUser != null && currentUser.getParseFile(Constants.PROFILE_IMAGE) == null) { 
       if (AccessToken.getCurrentAccessToken() != null) { //check if session opened properly 
        //get simple facebook and add the user properties we are looking to retrieve 
        Profile.Properties properties = new Profile.Properties.Builder() 
          .add(Profile.Properties.FIRST_NAME) 
          .add(Profile.Properties.GENDER) 
          .add(Profile.Properties.BIRTHDAY) 
          .add(Profile.Properties.ID) 
          .add(Profile.Properties.EMAIL) 
          .build(); 

        //The following line is where the debugger stops 
        //and the error gets thrown 
        simpleFacebook.getProfile(properties, new OnProfileListener() { 
         @Override 
         public void onComplete(Profile response) { 
          String id = response.getId(); 
          String name = response.getFirstName(); 
          String gender = response.getGender(); 
          String birthday = response.getBirthday(); 
          String email = response.getEmail(); 
          String age = getAge(birthday); 

          currentUser.put(Constants.NAME, name); 
          currentUser.put(Constants.AGE, age); 
          currentUser.put(Constants.GENDER, gender); 
          currentUser.put(Constants.EMAIL, email); 
          currentUser.saveInBackground(); 

          if (id != null) { //display the profile image from facebook 
           subscriber.onNext("https://graph.facebook.com/" + id + "/picture?type=large"); 
          } 
         } 

Có gì xảy ra ở đây? Nó được làm việc tốt như hiện nay và bây giờ nó đang nói rằng tôi đang trên một số chủ đề trợ giúp. Theo như tôi đã được quan tâm tôi đã được trên thread UI đến thời điểm này. Nếu ai đó có thể giúp tôi điều đó sẽ tuyệt vời, nếu không tôi có thể phải bỏ RxJava vào lúc này vì nó không làm việc cho tôi. Cảm ơn trước!

+0

Tôi nghi ngờ vấn đề là: '.subscribeOn (Schedulers.io())'. Bạn nên đăng ký trên bộ lập lịch trình chủ đề chính vì các hoạt động mạng của bạn dường như không đồng bộ. – corsair992

+0

Bạn có thể đăng theo dõi ngăn xếp không? Có phải vì 'getProfile' cần được gọi trong chuỗi chính không? – zsxwing

+0

Tôi nghi ngờ rằng getprofile cần được gọi trên chủ đề chính nhưng tôi không hiểu tại sao nó lại hoạt động trước đó. Tôi có nên có subscribeOn (AndroidSchedulers.MainThread) không? –

Trả lời

0

Dường như cuộc gọi simpleFacebook.getProfile(properties, listener) thực hiện việc truyền nội bộ của chính nó. Thông thường bạn không muốn điều này với rxjava. Bạn muốn rxjava để chăm sóc luồng và tất cả các mã bạn viết nên được đồng bộ.

Tôi không quen với SDK Facebook, nhưng tôi sẽ tìm kiếm một cuộc gọi thực hiện yêu cầu đồng bộ. Vì vậy, một phương thức trông giống như public Profile getProfile(Properties properties) { thay vì một phương thức trả về void và yêu cầu người nghe.

Hy vọng điều này sẽ giúp ..

Các vấn đề liên quan