gpt4 book ai didi

java - Android-RxJava : Update UI from background thread using observable

转载 作者:行者123 更新时间:2023-12-04 23:56:32 25 4
gpt4 key购买 nike

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

我设法将 RxJava 依赖项包含到基本的 Android 项目中,并使用 AsyncTasks 编写了一个非常简单的主要 Activity 来处理网络请求。现在我试图用一个响应式(Reactive)的实现来替代 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);
}
}
}

最佳答案

使用 AsyncTask,您基本上是在工作线程上执行异步操作,然后在主线程上使用其结果。在 Rx 中你会使用类似下面的东西:

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

您似乎也对 onNextonErroronComplete 感兴趣。

  • onNext 每次 observable 发出一个项目时都会被调用。每次调用它时,它都会收到一个项目,然后可以对其进行处理。
  • onError 当 observable 由于任何原因遇到错误时调用。当它被调用时,它会收到一个 Throwable,它表示错误的原因。调用后,不调用 onNext 和 onComplete。
  • onComplete 在使用最后一项调用 onNext 之后调用。它不接收任何输入,例如您可以在其中进行一些清理。

使用上面的方法看起来像这样:

Observable.fromCallable(asyncOperation)
.subscribeOn(backgroundThread)
.observeOn(mainThread)
.subscribe(onNext, onError, onComplete)

[编辑]

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

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()
}
}
}

关于java - Android-RxJava : Update UI from background thread using observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60688724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com