我有一个改装请求,当我在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
}
}
试试这个..首先创建一个接口..让我们称之为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
}
});
}
你可以创建一个接口并在主线程上回调,或者在onSuccess()或onfailure()中获得api调用的响应后,启动一个新的AsynTask并在后台处理请求。
你可以像这样改变它
//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();
}
}
}