Я давно получаю эту проблему. Это процесс регистрации пользователя, я разбить его на 2 мероприятия:Невозможно вызвать Activity 2 после того, как Activity 1 успешно с успехом сохраняется в базе данных с помощью Restful web service
активность 1 - RegisterActivity (адрес электронной почты, пароль)
активность 2 - RegisterCustomerActivity (Фамилия, Имя, День рождения, ЭСТ ..).
Действие 2 может быть вызвано только в том случае, если операция 1 завершена успешно. К сожалению, после завершения Activity 1 пользователь успешно сохраняется в БД, система теряется, не может вернуться к теме пользовательского интерфейса, не могли бы вы помочь? Есть ли что-нибудь связанное с Thread?
public class RegisterActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
register_btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
boolean isResgisterUserSuccess = registerUser();
//02/18/2017: Error: After registering a user successfully, system gets lost,
//can't return to the UI thread, it doesn't go to the if loop below to invoke the startRegisterCustomerActivity()
if (isResgisterUserSuccess == true){
startRegisterCustomerActivity();
}
//startRegisterCustomerActivity();
}
});
}
private boolean registerUser(){
String email = register_edtEmail.getText().toString();
String pass = register_edtPassword.getText().toString();
String mobile = register_edtMobile.getText().toString();
resultString = "";
isSuccess = false;
RequestParams params = new RequestParams();
if (Utility.isNotNull(email)&&Utility.isNotNull(pass)&&Utility.isNotNull(mobile)){
if (Utility.isEmailValid(email)) {
if (Utility.isPhoneNumberValid(mobile)){
params.put("username", email);
params.put("password", pass);
params.put("phone", mobile);
params.put("description", "User Description");
params.put("category", "C");
invokeWS(params);
} else {
isSuccess = false;
resultString = "Please enter valid phone number!";
Toast.makeText(getApplicationContext(), resultString, Toast.LENGTH_LONG).show();
}
} else {
isSuccess = false;
resultString = "Please enter valid email!";
Toast.makeText(getApplicationContext(), resultString, Toast.LENGTH_LONG).show();
}
} else {
isSuccess = false;
resultString = "Please enter email, password and mobile!";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
}
return isSuccess;
}
private void invokeWS(RequestParams params){
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, params, new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String response){
JSONObject json;
register_prgDialog.hide();
try {
json = new JSONObject(response);
if(json.getBoolean("status")){
System.out.println("Inside invokeWS, inside try, status = " + json.getBoolean("status"));
isSuccess = true;
resultString = "You registered successfully!";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
} else {
isSuccess = false;
resultString = json.getString("error_msg");
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
isSuccess = false;
resultString = "Error Occured [Server's JSON response might be invalid]!";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Throwable error, String content){
register_prgDialog.hide();
if (statusCode == 404){
isSuccess = false;
resultString = "Requested resource not found";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
} else if (statusCode == 500) {
isSuccess = false;
resultString = "Something went wrong at server end!";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
} else {
isSuccess = false;
resultString = "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]";
Toast.makeText(RegisterActivity.this, resultString, Toast.LENGTH_LONG).show();
}
}
});
}
private void startRegisterCustomerActivity(){
System.out.println("Inside startRegisterCustomerActivity");
Intent addRegisterCustomer = new Intent(RegisterActivity.this, RegisterCustomerActivity.class);
String email = register_edtEmail.getText().toString();
String mobile = register_edtMobile.getText().toString();
//Create Bundle
Bundle bundle = new Bundle();
//Add your data to Bundle
bundle.putString("Email", email);
bundle.putString("Mobile", mobile);
//Add the Bundle to Intent
addRegisterCustomer.putExtras(bundle);
//Fire the activity
startActivity(addRegisterCustomer);
}
}
Это было бы подходящее время, чтобы узнать, как работает отладчик. Отладчик раскроет больше информации, чем я полагаю. –
есть 2 решения для этого, так как invokeWS является асинхронным, он не даст результата, либо вы зацикливаете, чтобы проверить, завершился ли метод invokeWS, или поместил вызов startRegisterCustomerActivity внутри метода onsuccess для invokeWS. ПРИЧИНА ПОТОМУ ЧТО ЭТИ АСНИК НАХОДИТСЯ НА ДРУГОЙ РЕЗЬБЕ И ПОСЛЕ ВАС CALL registerUser() ДАЖЕ ЕСЛИ invokeWS() НЕ ЗАВЕРШЕН, ИДЕТ ИДЕТ НА СЛЕДУЮЩУЮ ЛИНИЮ КОДА, КОТОРУЮ ПРОВЕРКА isResgisterUserSuccess ВАРИАБЕЛЬ –
Спасибо, vims liu, позвольте мне попробовать свой путь, Тогда я вас обновлю. –