我有我的片段类来管理登录过程,它包含一个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!");
}
}
}
}
请帮帮我。