Java 将侦听器传递给异步任务时发生类转换错误

Java 将侦听器传递给异步任务时发生类转换错误,java,android,class,asynchronous,Java,Android,Class,Asynchronous,我正在处理异步任务,结构是主类中的实现接口,将主类作为侦听器传递给异步任务,当异步类完成时,调用侦听器函数,问题是当我将主类传递给异步任务时,它返回以下错误: 02-18 19:37:43.826: E/AndroidRuntime(15928): FATAL EXCEPTION: AsyncTask #2 02-18 19:37:43.826: E/AndroidRuntime(15928): java.lang.RuntimeException: An error occured while

我正在处理异步任务,结构是主类中的实现接口,将主类作为侦听器传递给异步任务,当异步类完成时,调用侦听器函数,问题是当我将主类传递给异步任务时,它返回以下错误:

02-18 19:37:43.826: E/AndroidRuntime(15928): FATAL EXCEPTION: AsyncTask #2
02-18 19:37:43.826: E/AndroidRuntime(15928): java.lang.RuntimeException: An error occured while executing doInBackground()
02-18 19:37:43.826: E/AndroidRuntime(15928):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.lang.Thread.run(Thread.java:856)
02-18 19:37:43.826: E/AndroidRuntime(15928): Caused by: java.lang.ClassCastException: com.project.hkseven.Fragment.Home$1 cannot be cast to com.project.hkseven.Listener.LoginListener
02-18 19:37:43.826: E/AndroidRuntime(15928):    at com.project.hkseven.Utility.APIHandler.doInBackground(APIHandler.java:69)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at com.project.hkseven.Utility.APIHandler.doInBackground(APIHandler.java:1)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-18 19:37:43.826: E/AndroidRuntime(15928):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-18 19:37:43.826: E/AndroidRuntime(15928):    ... 5 more
下面是我如何调用主类(一个片段)并将其传递给异步任务

new APIHandler(getActivity(),tracker,"login").execute(this,session.getAccessToken());
API处理程序是一个异步任务,处理方式如下

public class APIHandler extends AsyncTask<Object, Void, JSONObject> {
    private String TAG = "APIHandler";
    private LoginListener loginListener;
    private UploadImageListener uploadImageListener;
    private UpdateProfileListener updateProfileListener;
    private MyPtListener myPtListener;

    public Context ctx;
    public String type;
    public String url;
    public String formType;
    public EasyTracker tracker;
    public String token;
    public String memId;

    public APIHandler(Context _ctx,EasyTracker _tracker,String _formType) {
        this.ctx = _ctx;
        this.tracker = _tracker;
        this.formType = _formType;

        //Get access data
        SharedPreferences prefs = ctx.getSharedPreferences("userInfo", 0);
        token = prefs.getString("token","");
        memId = prefs.getString("memId","");
    }

    @Override
    protected JSONObject doInBackground(Object... params) {

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

        if (formType.equals("login")){

            url = Constant.loginAPI;
            loginListener = (LoginListener) params[0];

            Log.d(TAG, "Login API(token): " + params[1] );

            builder.addTextBody("var1", (String) params[1]); //Facebook access token
            builder.addTextBody("var2", "2"); //Device type 2 = android

.......................

@Override
    protected void onPostExecute(JSONObject result) {


        try {
            if(result != null)  {
                if (formType.equals("login")){
                    if (result.getString("result").equals("ok")) {
                        loginListener.onLoginComplete(result.getString("member_id"),result.getString("token"));
                    }else {
                        loginListener.onLoginFailure(result.getString("error_code"));   
                    }
主类片段:

public class Home extends Fragment implements LoginListener {
    public View rootView;
    public ImageView HomeBg;
    public ImageView buttonLoginLogout;
    public TextView chi;
    public TextView eng;
    public ColorStateList oldColor;
    public SharedPreferences prefs;
    public EasyTracker tracker = null;
    public String[] PERMISSION_ARRAY_READ = {"email"};
    public List<String> PERMISSION_LIST;
    public SharedPreferences.Editor editor;
    public ProgressDialog pd;

    //Facebook login
    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        tracker = EasyTracker.getInstance(getActivity());

        PERMISSION_LIST = Arrays.asList(PERMISSION_ARRAY_READ);

        prefs = getActivity().getSharedPreferences("userInfo", 0);
        editor = prefs.edit();

        getActivity().getActionBar().hide();

        rootView = inflater.inflate(R.layout.home, container, false);
        buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
        eng = (TextView) rootView.findViewById(R.id.btn_eng);
        chi = (TextView) rootView.findViewById(R.id.btn_chi);

        if (Utility.getLocale(getActivity()).equals("TC")) {
            chi.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = eng.getTextColors();
        } else {
            eng.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = chi.getTextColors();

        }

        eng.setOnClickListener(setChangeLangListener("EN"));
        chi.setOnClickListener(setChangeLangListener("TC"));

        //Facebook login
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        Session session = Session.getActiveSession();
        if (session == null) {
            if (savedInstanceState != null) {
                session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
            }
            if (session == null) {
                session = new Session(getActivity());
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this).setPermissions(PERMISSION_LIST).setCallback(statusCallback));
            }
        }

       updateView();
       return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Session.getActiveSession().addCallback(statusCallback);
        tracker.set(Fields.SCREEN_NAME, "hk7app/CX/" + Utility.getLocale(getActivity()) + "/Landing Page");
        tracker.send(MapBuilder.createAppView().build());
    }

    @Override
    public void onStop() {
        super.onStop();
        Session.getActiveSession().removeCallback(statusCallback);
        EasyTracker.getInstance(getActivity()).activityStop(getActivity());
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
    }

    @SuppressWarnings("deprecation")
    private void updateView() {
        final Session session = Session.getActiveSession();
        if (session.isOpened()) {
            Request.executeMeRequestAsync(session,
                new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user,Response response) {
                        // TODO Auto-generated method stub
                        if (user != null) {
                            if (!user.getId().equals(prefs.getString("fbId",""))) {
                                editor.putString("fbId", user.getId());
                                editor.putString("fName", user.getFirstName());
                                editor.putString("lName", user.getLastName());
                                editor.putString("email", user.asMap().get("email").toString());
                                editor.commit();
                                //pd = ProgressDialog.show(getActivity(), getActivity().getResources().getString(R.string.sys_info),getActivity().getResources().getString(R.string.loading));
                                Log.d("test1",session.getAccessToken());
                                new APIHandler(getActivity(),tracker,"login").execute(this,session.getAccessToken());
                            } else {
                                onLoginComplete("","");
                            }
                        }
                    }
            });             

        } else {
            buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) { onClickLogin(); }
            });
        }
    }

    private void onClickLogin() {
        tracker.send(MapBuilder.createEvent("menu_click","Fbconnect","connectFB_" + Utility.getLocale(getActivity()),null).build());
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setPermissions(PERMISSION_LIST).setCallback(statusCallback));
        } else {
            Session.openActiveSession(getActivity(), this, true, statusCallback);
        }
    }

    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            updateView();
        }
    }

    public OnClickListener setChangeLangListener(final String lang) {
        OnClickListener changeLangListener = new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Configuration config = new Configuration(getResources().getConfiguration());

                if (Utility.getLocale(getActivity()).equals("TC") && lang.equals("EN")) {
                    tracker.send(MapBuilder.createEvent("menu_click","language", "switchEN", null).build());
                    config.locale = Locale.ENGLISH;
                    chi.setTextColor(oldColor);
                    eng.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                } else if (Utility.getLocale(getActivity()).equals("EN") && lang.equals("TC")) {
                    tracker.send(MapBuilder.createEvent("menu_click","language", "switchTC", null).build());
                    config.locale = Locale.TRADITIONAL_CHINESE;
                    eng.setTextColor(oldColor);
                    chi.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                }

                getResources().updateConfiguration(config,getResources().getDisplayMetrics());

                onConfigurationChanged(config);
            }
        };
        return changeLangListener;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      Intent intent = getActivity().getIntent();
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
      getActivity().finish();
      startActivity(intent);
    }

    @Override
    public void onResume() {
        super.onResume();
        AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id));
    }

    @Override
    public void onLoginComplete(String memberId, String token) {    
        if (pd != null)
            pd.dismiss();

        if (!memberId.equals("") && !token.equals("")) {
            editor.putString("memId", memberId);
            editor.putString("token", token);
        }

        buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
        buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                 tracker.send(MapBuilder.createEvent("menu_click","TakeSelfie","Selfie_now_" + Utility.getLocale(getActivity()),null).build());
                ((LandingPage)getActivity()).tabHost.setCurrentTab(2);
            }
        });
    }

    @Override
    public void onLoginFailure(String errorMsg) {
        if (pd != null)
            pd.dismiss();

        Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
    }

}

我想问题就在这方面

loginListener = (LoginListener) params[0];

因为你的参数[0]是这个我指的是家。但是,在doInBackground()方法中,您已将其强制转换为LoginListener。正如@Blackbelt所说,你能检查一下你的家庭是否实现了LoginListener吗。

我想问题在于这一行

loginListener = (LoginListener) params[0];

因为你的参数[0]是这个我指的是家。但是,在doInBackground()方法中,您已将其强制转换为LoginListener。正如@Blackbelt所说,你能检查一下你的家庭是否实现了LoginListener吗。

我想问题在于这一行

loginListener = (LoginListener) params[0];

因为你的参数[0]是这个我指的是家。但是,在doInBackground()方法中,您已将其强制转换为LoginListener。正如@Blackbelt所说,你能检查一下你的家庭是否实现了LoginListener吗。

我想问题在于这一行

loginListener = (LoginListener) params[0];

因为你的参数[0]是这个我指的是家。但是,在doInBackground()方法中,您已将其强制转换为LoginListener。正如@Blackbelt所说,你能检查一下你的家是否实现了LoginListener吗。

据我所知,你正在使用接口
LoginListener
作为
回调
侦听器。但是,您没有在您的
主页
类中实现
LoginListener
接口,这是不公平的。您可以检查您的类定义

public class Home extends Fragment implements LoginListener {

据我所知,您正在使用接口
LoginListener
作为
回调
侦听器。但是,您没有在您的
主页
类中实现
LoginListener
接口,这是不公平的。您可以检查您的类定义

public class Home extends Fragment implements LoginListener {

据我所知,您正在使用接口
LoginListener
作为
回调
侦听器。但是,您没有在您的
主页
类中实现
LoginListener
接口,这是不公平的。您可以检查您的类定义

public class Home extends Fragment implements LoginListener {

据我所知,您正在使用接口
LoginListener
作为
回调
侦听器。但是,您没有在您的
主页
类中实现
LoginListener
接口,这是不公平的。您可以检查您的类定义

public class Home extends Fragment implements LoginListener {

解决问题的办法是更换这一行

loginListener = (LoginListener) params[0];


解决问题的办法是更换这一行

loginListener = (LoginListener) params[0];


解决问题的办法是更换这一行

loginListener = (LoginListener) params[0];


解决问题的办法是更换这一行

loginListener = (LoginListener) params[0];




在onCreate而不是onCreateView中获取上下文修复了该问题。感谢您帮助

在onCreate而不是onCreateView中获取上下文,修复了该问题。感谢您帮助

在onCreate而不是onCreateView中获取上下文,修复了该问题。感谢您帮助

在onCreate而不是onCreateView中获取上下文,修复了该问题。感谢您的帮助

is Home.java实现LoginListener?在片段类中创建LoginListener的对象作为匿名内部类对象,并将该对象作为execute方法中的第一个参数而不是此参数传递。请详细说明您在此处尝试实现的目标,例如,使用侦听器的目的是什么?您是否可以在调用此
apidhandler
asynctask?的
Home
类中发布更新的,感谢replyis Home.java实现LoginListener?在片段类中创建LoginListener的对象作为匿名内部类对象,并将该对象作为execute方法中的第一个参数而不是此参数传递。请详细说明您在此处尝试实现的目标,例如,使用侦听器的目的是什么?您是否可以在调用此
apidhandler
asynctask?的
Home
类中发布更新的,感谢replyis Home.java实现LoginListener?在片段类中创建LoginListener的对象作为匿名内部类对象,并将该对象作为execute方法中的第一个参数而不是此参数传递。请详细说明您在此处尝试实现的目标,例如,使用侦听器的目的是什么?您是否可以在调用此
apidhandler
asynctask?的
Home
类中发布更新的,感谢replyis Home.java实现LoginListener?在片段类中创建LoginListener的对象作为匿名内部类对象,并将该对象作为execute方法中的第一个参数而不是此参数传递。请详细说明您在此处尝试实现的目标,比如说,使用侦听器的目的是什么?你能在调用这个
apichandler
asynctask的
Home
类上发布这个
Home
类吗?更新了,谢谢你的回复如果你不确定,你应该让OP解释一下。我认为你错了。LogCat显示这是指Home ClassThank@Blackbel和user2340612,我编辑了我的答案。Home ClassImplements LoginListener请检查我更新的问题Thank您正在调用片段ryt中的execute()方法?如果是,请尝试传递getActivity()而不是此?如果你不确定的话,请让我知道。如果你不确定,你应该请OP澄清并发表评论。我认为你错了。LogCat显示这是指Home ClassThank@Blackbel和user2340612,我编辑了我的答案。Home ClassImplements LoginListener请检查我更新的问题Thank您正在调用片段ryt中的execute()方法?如果是,请尝试传递getActivity()而不是此?让我知道