在我的活动中,我有多个Retrofit服务操作,并且这些服务在相同的Retrofit Callback方法上进行中继。当一个服务尝试同时获取其他服务使用的回调时,这些会导致空指针,如何解决此问题?
我一直在对Web服务调用进行改造。它在模拟器中工作正常,但是当我使用真实设备时,它崩溃并显示错误日志为:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at java.util.Collections.reverse(Collections.java:424)
at com.itmam.info.jadara.Notifications.Notifications_Items_Adapter.<init>(Notifications_Items_Adapter.java:89)
at com.itmam.info.jadara.Notifications.FragmentNotificationsItems.generateDataListNotification(FragmentNotificationsItems.java:82)
at com.itmam.info.jadara.Notifications.FragmentNotificationsItems.access$000(FragmentNotificationsItems.java:38)
at com.itmam.info.jadara.Notifications.FragmentNotificationsItems$1.onResponse(FragmentNotificationsItems.java:104)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:888)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8147)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
这是我的Retrofit客户类:
public class RetrofitGeneral {
private static Retrofit retrofit;
private static final String BASE_URL = "My_URL";
public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
这是我的翻新服务界面:
public interface getClientDetails {
@FormUrlEncoded
@POST("WebService.asmx/SelectClientById")
Call<List<ClientDetails>> getClientdetails(
@Field("ClientID") int ClientID,
@Field("Token") String Token,
@Field("CurrentEmployeeID") int CurrentEmployeeID
);
}
并且这样,我从适配器onBindViewHolder调用了翻新服务,该适配器多次调用了翻新:
@Override
public void onBindViewHolder(Notifications_Items_Adapter.Notifications_Holder holder, int position) {
myHolder = holder;
holderList.add(holder);
getTaskId(position);
getTaskDetails(taskID);
}
这是我的改造callBack方法:
private void getTaskDetails(int taskID){
getTaskDetails getTaskDetails=RetrofitGeneral.getRetrofitInstance().create(getTaskDetails.class);
Call<List<Task>> listCall=getTaskDetails.getDetails(taskID,Log_in.getToken(),Log_in.CurrentEmployeeID);
listCall.enqueue(new Callback<List<Task>>(){
@Override
public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {
task = response.body().get(0);
tasksList.add(task);
}
@Override
public void onFailure(Call<List<Task>> call, Throwable t) {
}
});
}
请帮助:)
错误是由于这一行
Toast.makeText(context, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
listCall.enqueue在后台线程上进行网络调用,并且您无法从后台线程显示吐司,您必须使用主线程来显示吐司。
您可以使用
runOnUiThread(new Runnable() {
Toast.makeText(context, "Something went wrong...Please try later!",Toast.LENGTH_SHORT).show();
}
解决错误。
有关呼叫失败的答案,您可以打印堆栈跟踪以找出答案
@Override
public void onFailure(Call<List<Task>> call, Throwable t) {
t.printStackTrace();
runOnUiThread(new Runnable() {
Toast.makeText(context, "Something went wrong...Please try later!",Toast.LENGTH_SHORT).show();
}
}