如何在可观察线程结束之前停止应用程序?

Posted

技术标签:

【中文标题】如何在可观察线程结束之前停止应用程序?【英文标题】:How can I stop application until an observable thread ends? 【发布时间】:2021-01-21 11:16:09 【问题描述】:

我正在使用 RetrofitRxJava2。在我的应用程序中,我有一个名为apiServiceGroupsObservable。据我了解,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 中立即反映任何添加、删除、字段更改

如何让fscanf自动在文件读结束时候停止执行

Wildfly:接收关闭事件以防止ManagedExecutorService提前关闭

pythony中子进程如果一定时间不结束就停止应该如何做?

java线程停止的方法