Đượ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!
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
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
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? –