如何在可观察线程结束之前停止应用程序?
Posted
技术标签:
【中文标题】如何在可观察线程结束之前停止应用程序?【英文标题】:How can I stop application until an observable thread ends? 【发布时间】:2021-01-21 11:16:09 【问题描述】:我正在使用 Retrofit 和 RxJava2。在我的应用程序中,我有一个名为apiServiceGroups
的Observable
。据我了解,Observable
在另一个线程中运行,而应用程序继续在主线程中工作。
我希望我的应用程序的主线程等到这部分代码完成运行。我该怎么做?
我的代码:
disposable = apiServiceGroups.getGroupsList(String.format("\"offset\":%s", groupCount))
.subscribeOn(Schedulers.io())
.observeOn(androidSchedulers.mainThread())
.subscribe(new Consumer<GroupsListResponse>()
@Override
public void accept(GroupsListResponse groupsListResponse) throws Exception
for (int i = 0; i < groupsListResponse.getGroups().size(); i++)
String currentName = groupsListResponse.getGroups().get(i).getGroupFullName();
if (groupName.equals(currentName.split(" ")[0]))
familiar.add(currentName);
, new Consumer<Throwable>()
@Override
public void accept(Throwable throwable) throws Exception
Log.e("thro", Objects.requireNonNull(throwable.getMessage()));
);
【问题讨论】:
【参考方案1】:您必须隐藏所有视图/片段并显示加载指示器或进度条,直到 API 任务在 accept 方法中完成。
一旦完成并得到响应,您必须隐藏加载指示器并显示视图/片段。
API 调用
public LiveData<Boolean> apiCall()
MutableLiveData<Boolean> loading = new MutableLiveData();
Disposable disposable = apiServiceGroups.getGroupsList(String.format("\"offset\":%s", groupCount))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<GroupsListResponse>()
@Override
public void accept(GroupsListResponse groupsListResponse) throws Exception
for (int i = 0; i < groupsListResponse.getGroups().size(); i++)
String currentName = groupsListResponse.getGroups().get(i).getGroupFullName();
if (groupName.equals(currentName.split(" ")[0]))
familiar.add(currentName);
loading.postValue(true);
, new Consumer<Throwable>()
@Override
public void accept(Throwable throwable) throws Exception
Log.e("thro", Objects.requireNonNull(throwable.getMessage()));
);
return loading;
在您的 Activity 或 Fragment 中
final Observer<String> nameObserver = new Observer<String>()
@Override
public void onChanged(@Nullable final String newName)
// Update the UI
;
apiCall().observe(this, nameObserver);
或
如果您不使用 livedata,您可以使用 API 调用响应中的回调
interface Response
public void onSuccess();
public void onFailure();
在你的 Activity/Fragment 中实现接口
将其传递给 API 方法
在成功/失败响应时使用回调
@Override public void accept(GroupsListResponse groupsListResponse) 抛出异常 for (int i = 0; i
if (groupName.equals(currentName.split(" ")[0]))
familiar.add(currentName);
callback.success()
【讨论】:
对不起,我还是不明白如何连接进度条和正在运行的进程。我应该怎么做才能停止应用程序并启动进度条?以上是关于如何在可观察线程结束之前停止应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在可观察集合的 UI 中立即反映任何添加、删除、字段更改