我刚刚开始构建一个简单的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
使用AsyncTask,您基本上是在工作线程上执行异步操作,然后在主线程上使用其结果。在Rx中,您将使用以下内容:
Observable.fromCallable(asyncOperation)
.subscribeOn(backgroundThread)
.observeOn(mainThread)
.subscribe(result -> { /* update UI for instance */ })
看来你也有兴趣onNext,onError和onComplete。
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。