【问题标题】:Alert Mainthread from retrofit when data is ready数据准备就绪时提醒 Mainthread 进行改造
【发布时间】:2017-12-18 18:58:58
【问题描述】:

我有一个改造请求,当我在 onResponse 中获取数据时, 我在文本视图中进行了多次插入,我在上面的代码中称之为繁重的工作,如果有的话,我会从 OnReponse 获得结果,否则我会从数据库中获得结果,所以问题是我在 OnResponse 和 OnFailure 中有相同的代码,所以有什么办法把我的繁重工作放在改造之外,等待响应从 OnResponse 或 OnFailure 得到一个结果??

call.enqueue(new Callback<Dashboard>() {
                     @Override
                     public void onResponse(Call<Dashboard> call, Response<Dashboard> response) {

                         realm.beginTransaction();
                         dashboard = realm.copyToRealmOrUpdate(response.body());
                         realm.commitTransaction();

                         // heavy work : insert in data in multiple text views


                     }

                     @Override
                     public void onFailure(Call<Dashboard> call, Throwable t) {
                         Log.e("error ", "" + t.getMessage());

                         dashboard = realm.where(Dashboard.class).findFirst();
                         // heavy work : insert in data in multiple text views
                     }
                 }

【问题讨论】:

    标签: android multithreading retrofit


    【解决方案1】:

    试试这个.. 首先创建一个接口..我们称之为OKCallback。

    public interface OKCallback {
    void onSuccess(String result);
    
    void onFailure(String result);
    

    }

    然后在您启动改造请求的方法中,像这样传递最终的 OKCallback okCallback..

     public void NetworkCall(final OKCallback okCallback){
    
    ...........
    call.enqueue(new Callback<Dashboard>() {
                @Override
                public void onResponse(Call<Dashboard> call, Response<Dashboard> response) {
    
                    realm.beginTransaction();
                    dashboard = realm.copyToRealmOrUpdate(response.body());
                    realm.commitTransaction();
    
                   // heavy work : insert in data in multiple text views
                   okCallback.onSuccess(parcel);
    
    }
    

    最后简单(ActivityX 实现 OKCallback)在任何类或活动中,您应该能够在那里完成繁重的工作。您还可以使用 Handler 将数据包装在 onSuccess 方法中,如图所示。

     @Override
    public void onSuccess(String result) {
        Handler handler = new Handler(ActivityX.this.getMainLooper());
    
        //process result and
        handler.post(new Runnable() {
            @Override
            public void run() {
    
                //heavy work done here will run on UI thread
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一个接口并在主线程上进行回调,或者在 onSuccess() 或 onfailure() 中获得 api 调用的响应后启动一个新的 AsynTask 并在后台处理请求。

      【讨论】:

        【解决方案3】:

        你可以这样改

        //create a interface
            public interface ConfirmationCallback {
                  void onSuccess(YourResponseClass value);
                  void onError();
            }
        
            //call this method from your class
            yourApiCall(new ConfirmationCallback() {
                        @Override
                        public void onSuccess(YourResponseClass value) {
                            realm.beginTransaction();
                            dashboard = realm.copyToRealmOrUpdate(value);
                            realm.commitTransaction();
                            // heavy work : insert in data in multiple text views
                        }
        
                        @Override
                        public void onError() {
                            dashboard = realm.where(Dashboard.class).findFirst();
                            // heavy work : insert in data in multiple text views
                        }
                    });
        
        
                 public void yourApiCall(final ConfirmationCallback confirmationCallback){
                    call.enqueue(new Callback<Dashboard>() {
                        @Override
                        public void onResponse(Call<Dashboard> call, Response<Dashboard> response) {
                           confirmationCallback.onSuccess(response.body());
                        }
        
                        @Override
                        public void onFailure(Call<Dashboard> call, Throwable t) {
                            Log.e("error ", "" + t.getMessage());
                            confirmationCallback.onError();
                        }
                    }
                }
        

        【讨论】:

        • 感谢回复,繁重的工作还是两次!
        • @stanly 现在检查这个答案
        猜你喜欢
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 2012-07-31
        • 2019-03-07
        • 2011-08-26
        • 2013-02-14
        • 2019-10-09
        • 2017-07-05
        相关资源
        最近更新 更多