Fragment中的Android类Cast Exception

时间:2017-08-27 14:37:09

标签: android android-fragments callback fragment classcastexception

当前我遇到了一个我无法解决的问题,我有一个控制器,一个片段和一个Activity,问题是,我需要控制器内部的应用程序上下文,所以我创建了一个控制器的实例来自Fragment,并在其构造函数中将appContext作为参数传递,但抛出异常,这是函数getReligions()中的类强制转换异常,我的控制器位于我有回调的行中,任何想法如何解决这个问题? 这是我的代码

.reset_states()

在控制器类

      @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        controller = new Controller(getActivity().getApplicationContext());
        imageUploadHandler = new ImageHandler(getApplicationContext());
        rootView = inflater.inflate(R.layout.setup_edit_profile, container, false);
    }   

public void getReligions() {
    if (religions != null) {
        religionSpinner();
        return;
    }
    controller.getReligions();
}

myLogCat:

public void getReligions(){
        JSONObject params = new JSONObject();
        RequestQueue queue = Volley.newRequestQueue(context);
        String url = "https://www.doyousonder.com/api/1.0.0/religion";
        queue.add(new JsonObjectRequest(com.android.volley.Request.Method.GET, url, params,
                new Response.Listener<JSONObject>() {
                    public void onResponse(JSONObject response) {
                        ((GeneralCallBack)context).VolleyResponse(response,"Religions");
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Authorization", orientation_adj.getContext().getResources().getString(R.string.bearer));
                return params;
            }
        });
    }

这里是我的回调

     java.lang.ClassCastException: 
com.eseed.sonder.utils.orientation_adj cannot be cast to 
    com.eseed.sonder.utils.GeneralCallBack
                                                                      at com.eseed.sonder.utils.Controller$61.onResponse(Controller.java:904)
                                                                      at com.eseed.sonder.utils.Controller$61.onResponse(Controller.java:902)
                                                                      at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
                                                                      at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:234)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5526)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

`public class orientation_adj extends Application {

     @Override
    public void VolleyResponse(String data) {

    }

    @Override
    public void VolleyResponse(JSONObject response) {

    }

    @Override
    public void VolleyResponse(JSONObject response, String data) {
        Gson gson = new Gson();
        if(data.equals("Religions")){
            try {
                Type t = new TypeToken<ReligionData[]>() {}.getType();
                religions = gson.fromJson(String.valueOf(response.getJSONObject("data").getJSONArray("list_of_religions")), t);
                religion_names = new String[religions.length + 1];
                religion_names[0] = "Select";
                for (int i = 0; i < religions.length; i++) {
                    religion_names[i + 1] = (religions[i].religion_name);
                }
                religionSpinner();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }else if(data.equals("Nationalities")){
            try {
                Type t = new TypeToken<NationalityData[]>() {
                }.getType();
                nationalities = gson.fromJson(String.valueOf(response.getJSONObject("data").getJSONArray("list_of_nationalities")), t);
                nationality_names = new String[nationalities.length + 1];
                nationality_names[0] = "Select";
                for (int i = 0; i < nationalities.length; i++) {
                    nationality_names[i + 1] = (nationalities[i].nationality_name);
                }
                nationalitySpinner();
                loadingIcon.hide();
            } catch (JSONException e) {
                System.out.println(e.getMessage());
            }

        }
    }

}

1 个答案:

答案 0 :(得分:0)

你的问题在这里

class orientation_adj extends Application

在这里

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    controller = new Controller(getActivity().getApplicationContext());

您的Application类不是实现接口的上下文,我假设Activity是

在这种情况下,您只需要

controller = new Controller(getActivity());

之后,设置一些额外的日志语句和断点来更好地调试回调代码