2017-02-20 15 views
0

Я давно получаю эту проблему. Это процесс регистрации пользователя, я разбить его на 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); 
} 
} 
+0

Это было бы подходящее время, чтобы узнать, как работает отладчик. Отладчик раскроет больше информации, чем я полагаю. –

+0

есть 2 решения для этого, так как invokeWS является асинхронным, он не даст результата, либо вы зацикливаете, чтобы проверить, завершился ли метод invokeWS, или поместил вызов startRegisterCustomerActivity внутри метода onsuccess для invokeWS. ПРИЧИНА ПОТОМУ ЧТО ЭТИ АСНИК НАХОДИТСЯ НА ДРУГОЙ РЕЗЬБЕ И ПОСЛЕ ВАС CALL registerUser() ДАЖЕ ЕСЛИ invokeWS() НЕ ЗАВЕРШЕН, ИДЕТ ИДЕТ НА СЛЕДУЮЩУЮ ЛИНИЮ КОДА, КОТОРУЮ ПРОВЕРКА isResgisterUserSuccess ВАРИАБЕЛЬ –

+0

Спасибо, vims liu, позвольте мне попробовать свой путь, Тогда я вас обновлю. –

ответ

0

Лучше всего использовать AsyncTask при общении с сервером.

От андроид Docs:

AsyncTask позволяет правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

AsyncTask разработан как вспомогательный класс вокруг Thread and Handler и не представляет собой общую структуру потоков. AsyncTasks в идеале следует использовать для коротких операций (максимум за несколько секунд). Если вам нужно поддерживать потоки в течение длительного периода времени, настоятельно рекомендуется использовать различные API-интерфейсы, предоставляемые пакетом java.util.concurrent, например Исполнитель, ThreadPoolExecutor и FutureTask.

+0

Я пробовал AsyncTask, не работает, причина, по которой он не работает, похож на vims liu, о котором говорилось выше. Я попробую его рекомендовать startRegisterCustomerActivity внутри метода onsuccess метода invokeWS. –