改装响应中的Android运行时异常

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

在我的应用程序中,我一直在对Web服务调用进行改造。它在模拟器中工作正常,但是当我使用真实设备时,它崩溃并显示错误日志为:

java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
    at android.widget.Toast$TN.<init>(Toast.java:415)
    at android.widget.Toast.<init>(Toast.java:122)
    at android.widget.Toast.makeText(Toast.java:287)
    at android.widget.Toast.makeText(Toast.java:277)
    at com.itmam.info.jadara.Notifications.Notifications_Items_Adapter$4.onFailure(Notifications_Items_Adapter.java:326)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$2.run(ExecutorCallAdapterFactory.java:79)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:929)

这是我的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调用Retrofit服务,

@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();
        }
    });
}

请帮助:)

android api retrofit runtimeexception ui-thread
1个回答
0
投票

错误是由于这一行

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