数据准备就绪时,通过改造提醒主线程

问题描述 投票:0回答:3

我有一个改装请求,当我在onResponse中获取数据时,我在textviews中插入了多次插入,我在上面的代码中调用了大量工作,如果有一个,我从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
3个回答
0
投票

试试这个..首先创建一个接口..让我们称之为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
        }
    });
}

0
投票

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


0
投票

你可以像这样改变它

//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();
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.