繁体   English   中英

结合使用RxAndroid

[英]Using RxAndroid with retrofit

我一直在寻找问题,但找不到解决方案,因为RxAndroid很难理解。

如何从互联网获取数据并将其显示在屏幕上?

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Button btnLoad;
ListView listView;
public static final String BASE_URL = "http://api.icndb.com/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnLoad = findViewById(R.id.btnSet);
    btnLoad.setOnClickListener(this);
    listView = findViewById(R.id.listView);
}

@Override
public void onClick(View v) {
    useRxJava();
}

private void setAdapter(ArrayList<String> jokes) {
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, jokes);
    listView.setAdapter(adapter);
}

private ArrayList<String> sentRequest() {
    ArrayList<String> jokes = new ArrayList<>();
    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create());
    Retrofit retrofit = builder.build();
    JokeRetrofitInterface client = retrofit.create(JokeRetrofitInterface.class);

    Call<RootObject> call = client.getJokes();
    RootObject rootObject = null;
    try {
        rootObject = call.execute().body();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Value[] values = rootObject.getValue();
    for (Value value : values) {
        String joke = value.getJoke();
        jokes.add(joke);
    }
    return jokes;
}


private void useRxJava() {

    Observable observable = Observable.create(new ObservableOnSubscribe<ArrayList<String>>() {
        @Override
        public void subscribe(ObservableEmitter<ArrayList<String>> emitter) throws Exception {

            ArrayList<String> myJokes = new ArrayList<>();
            myJokes = sentRequest();
            emitter.onNext(myJokes);
        }
    });

    observable.subscribe(new Consumer<ArrayList<String>>() {
        @Override
        public void accept(ArrayList<String> jokes) throws Exception {
            setAdapter(jokes);
        }
    });
}

}

更新您的方法。 useRxJava()

private void useRxJava() {

    Observable observable = Observable.fromCallable(new 
        Callable<ArrayList<String>>() {
            @Override
            public ArrayList<String> call() throws Exception {
                return sentRequest()
            }
    });

    observable.subscribeOn(Schedulers.io) // This makes sure that network operation happens in io thread
        .observeOn(AndroidSchedulers.mainThread()) // This makes sure that you get response back in main thread
        .subscribe(new Consumer<ArrayList<String>>() {
            @Override
            public void accept(ArrayList<String> jokes) throws Exception {
                setAdapter(jokes);
            }
    });
}

其他一些建议和意见:

  1. 使用rxjava2代替RxJava 1
  2. 使JokeRetrofitInterface单身
  3. 改造本身可以返回一个Observable,因此您的JokeRetrofitInterface.getJokes可以自身返回一个Observable(在RxJava 2中为Single),这将减少一些代码。
  4. 我在您的代码中找不到RxAndroid的使用,它只是普通的RxJava
  5. 不要停止学习:)。 一开始会很困难,但最终您将获得冠军。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM