开发者社区> 问答> 正文

Android-RxJava:使用可观察的背景线程更新UI

我刚刚开始构建一个简单的Android应用程序,其中我想在后台线程中发出网络请求,然后使用服务器响应更新主线程(UI线程)。到目前为止,我使用了AsyncTasks,但是以后的实现中我想使用反应性Java(RxJava)。我以前从未做过响应式调用,因此我想有一个简单但完整的示例(可观察和观察者的创建和订阅),可以在此基础上进一步进行构建。

我设法将RxJava依赖项包含到基本的Android项目中,并使用AsyncTasks针对网络请求编写了一个非常简单的主要活动。现在,我尝试用反应式实现替换AsyncTask实现,但是陷入了有关Observable和Observer的所有信息中。我只是不确定最小但可以正常工作的示例到底需要什么。

在将主要部分转换为响应式实现方面,我确实会有所帮助,因为我不知道如何处理响应字符串中Observable的生成并订阅Observer。

谢谢。

package com.example.reactiveTest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Button btnSend = null;
    private TextView result = null;

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

        this.btnSend = findViewById(R.id.button_send);
        this.result = findViewById(R.id.result);
    }

    public void onClickBtnSend(View view) {
        new SomeTask().execute("Just some String");
    }

    class SomeTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... strings) {
            // server request returning response String
            return response;
        }

        @Override
        protected void onPostExecute(String string) {
            // update UI with response String
            result.setText(string);
        }
    }
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-25 18:56:01 1264 0
1 条回答
写回答
取消 提交回答
  • 使用AsyncTask,您基本上是在工作线程上执行异步操作,然后在主线程上使用其结果。在Rx中,您将使用以下内容:

    Observable.fromCallable(asyncOperation)
       .subscribeOn(backgroundThread)
       .observeOn(mainThread)
       .subscribe(result -> { /* update UI for instance */ })
    

    看来你也有兴趣onNext,onError和onComplete。

    • onNext每次可观察对象发出一个项目时都会调用。每次调用它都会收到一个项目,然后可以对其进行处理。
    • onError当可观察对象由于任何原因遇到错误时,将调用。调用它时,它将收到一个Throwable,它表示错误的原因。调用之后,不会调用onNext和onComplete。
    • onComplete在最后一个项目调用onNext之后被调用。它没有收到任何输入,例如,您可以在其中进行一些清理。 使用以上方法看起来像这样:
    Observable.fromCallable(asyncOperation)
       .subscribeOn(backgroundThread)
       .observeOn(mainThread)
       .subscribe(onNext, onError, onComplete)
    

    如果您想使用创建您的Observable Observable.create(),您绝对可以这样做,它使您可以更好地控制通过Observable发出的内容和时间。例如,如果您要处理可能由网络请求导致的某些特定错误,并Throwable根据错误发出不同的s,则可以执行此操作。

    ObservableOnSubscribe asyncOperation = new Observable.OnSubscribe<Integer>() {
        @Override
        public void call(Subscriber<? super Integer> emitter) {
            try {
                // network request
                // Once result is ready, call emitter.onNext().
                // When done, complete this Observable by calling emitter.onComplete()
            } catch (Exception e) {
                // handle error, and emit it using emitter.onError()
            }
        }
     } 
    

    回答来源:Stack Overflow

    2020-03-25 18:57:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载