在片段中未调用AsyncTask OnPostExecute

时间:2017-03-29 10:31:46

标签: android-asynctask

我有我的片段类来管理登录过程,它包含一个AsyncTask,它调用服务器来检查用户(存储它等),如果一切正常,通过OnPostExecute方法执行进一步的下载。 问题是永远不会调用OnPostExecute方法。 这是代码:

public class LoginFragment extends Fragment implements DownloadInitialData.IDownloadComplete{

public interface LoginListener{
    void loginSubmitted(String email, String password);
    void showRegisterPage();
    void showHomeActivity();
}

private LoginListener listener;

public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof LoginListener)
        setListener((LoginListener) activity);
}


@Override
public void initialDownloadComplete() {
    listener.showHomeActivity();
}

public void setListener(LoginListener listener) {
    this.listener = listener;
}

private Button btnLogin;
private Button btnLinkToRegister;
private EditText inputEmail;
private EditText inputPassword;
private LoginButton fbLoginBtn;

private CallbackManager callbackManager;
private Bundle bFacebookData;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

    View view = inflater.inflate(R.layout.login_fragment, container, false);


    fbLoginBtn = (LoginButton) view.findViewById(R.id.fb_login_btn);
    fbLoginBtn.setFragment(this);

    inputEmail = (EditText) view.findViewById(R.id.email);
    inputPassword = (EditText) view.findViewById(R.id.password);
    btnLogin = (Button) view.findViewById(R.id.btnLogin);
    btnLinkToRegister = (Button) view.findViewById(R.id.btnLinkToRegisterScreen);

    AppEventsLogger.activateApp(getActivity());
    bFacebookData = new Bundle();  //all data will be save into this bundle

    fbLoginBtn.setReadPermissions(Arrays.asList("email", "public_profile", "user_birthday"));

    fbLoginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(final LoginResult loginResult) {
            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            FacebookRequestError error = response.getError();
                            if (error != null) {
                                Utils.showText(getActivity(), error.toString());
                                return;
                            }

                            bFacebookData = getFacebookData(object);
                            try {
                                String gender = String.valueOf(bFacebookData.get("gender")).equals("male") ? "M" : "F";
                                new LoginFbRequest().execute(String.valueOf(bFacebookData.get("email")),
                                        String.valueOf(bFacebookData.get("id")),
                                        String.valueOf(bFacebookData.get("name")),
                                        Utils.formatDate((String) bFacebookData.get("birthday"), "mm/dd/yyyy", "yyyy-MM-dd"),
                                        gender,String.valueOf(bFacebookData.get("picture")),
                                        Utils.getTokenFirebase(getActivity()));
                            } catch (ParseException e) {

                                e.printStackTrace();
                            }
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, name, email, gender, birthday, picture.type(large)");
            request.setParameters(parameters);
            request.executeAsync();

        }

        @Override
        public void onCancel() {
            Utils.showText(getActivity(),"Canceled!");
        }

        @Override
        public void onError(FacebookException error) {
            Utils.showText(getActivity(),"Facebook error!");
        }
    });

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String email = inputEmail.getText().toString().trim();
            String password = inputPassword.getText().toString().trim();
            listener.loginSubmitted(email, password);
        }
    });

    // Link to Register Screen
    btnLinkToRegister.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            listener.showRegisterPage();
        }
    });
    return view;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

@Override
public void onStop() {
    super.onStop();
}

@Override
public void onResume() {
    super.onResume();
}

private Bundle getFacebookData(JSONObject object) {
    Bundle bundle = new Bundle();
    try {
        if (object.has("name"))
            bundle.putString("name", object.getString("name"));
        if (object.has("email"))
            bundle.putString("email", object.getString("email"));
        if (object.has("id"))
            bundle.putString("id", object.getString("id"));
        if (object.has("birthday"))
            bundle.putString("birthday", object.getString("birthday"));
        if (object.has("gender"))
            bundle.putString("gender", object.getString("gender"));
        if (object.has("picture")) {
            String profilePicUrl = object.getJSONObject("picture").getJSONObject("data").getString("url");
            bundle.putString("picture", profilePicUrl);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return bundle;
}


private class LoginFbRequest extends AsyncTask<String, String, User> {

    private static final String LOGIN_URL = "http://beachsports.altervista.org/fb_login.php";

    @Override
    protected User doInBackground(String... params) {
        final String fb_id = params[1];
        final String email = params[0];
        final String fullname = params[2];
        final String date = params[3];
        final String gender = params[4];
        final String picturesURL = params[5];
        final String tokenFirebase = params[6];

        Map parameters = new HashMap<String, String>(){{
            put("email",email);
            put("fb_id", fb_id);
            put("fullname", fullname);
            put("data_nascita", date);
            put("gender", gender);
            put("picture", picturesURL);
            put("tokenFirebase", tokenFirebase);
        }};
        String responseByServer = HttpUtils.postRequest(LOGIN_URL, parameters);
        //richiesta fatta in una classe statica a parte; viene restituito un JSONObject come quello sotto
        //{"error":true/false,"user":{"name". "...." ecc..}}
        User user = null;
        try {
            JSONObject responseBody = new JSONObject(responseByServer);
            if ((!responseBody.getBoolean("error"))) {
                user = new User(responseBody.getJSONObject("user"));
            } else {
                // Error in login. Get the error message
                final String errorMsg = responseBody.getString("error_msg");
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Utils.showText(getActivity(),errorMsg);
                    }
                });
            }
        } catch (final JSONException e) {
            // JSON error
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Utils.showText(getActivity(),"Json error EXCEPTION: " + e.getMessage());
                }
            });
        }

        return user;
    }

    @Override
    protected void onPostExecute(User userLogged) {
        if(userLogged!=null){
            Utils.showText(getActivity(),"login avvenuto con successo. L'utente attualmente loggato è: "+ userLogged.getFullname());
            LoginSessionManager.setUserLogin(getActivity(), userLogged);
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.containerLogin, new DownloadInitialData(),  new DownloadInitialData().getClass().getName());
            transaction.commit();
            initialDownloadComplete();
        }else{
            Utils.showText(getActivity(),"Login non riuscito!");
        }
    }
}
}

请帮帮我。

0 个答案:

没有答案