2014-11-02 4 views
1

Это мой AsyncTask:Обратный звонок от AsyncTask doInBackground

public class RegisterTask extends AsyncTask<Context, String, JSONObject> { 
    private Context context = null; 
    private OnRegisterTaskCompleted onRegisterTaskCompleted = null; 
    private ProgressDialog progressDialog = null; 
    private String firstname = null; 
    private String lastname = null; 
    private String email = null; 
    private String password = null; 

    public RegisterTask(Context context, OnRegisterTaskCompleted onRegisterTaskCompleted, String firstname, String lastname, String email, String password) { 
     this.context = context; 
     this.onRegisterTaskCompleted = onRegisterTaskCompleted; 
     this.firstname = firstname; 
     this.lastname = lastname; 
     this.email = email; 
     this.password = password; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     this.progressDialog = DialogManager.getProgressDialog(this.context, this.context.getResources().getString(R.string.title_progress), this.context.getResources().getString(R.string.message_registration_progress)); 
     this.progressDialog.show(); 
    } 

    @Override 
    protected JSONObject doInBackground(Context... context) { 
     ConnectionEstablisher connectionEstablisher = new ConnectionEstablisher(this.context); 
     JSONFunctions jsonFunctions = new JSONFunctions(connectionEstablisher); 
     JSONObject json = null; 

     try { 
      json = jsonFunctions.registerUser(this.firstname, this.lastname, this.email, this.password); 
     } catch (ClientProtocolException e) { 
      this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_PROTOCOL_EXCEPTION, null); 
     } catch (IOException e) { 
      this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_IO_EXCEPTION, null); 
     } catch (JSONException e) { 
      this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_JSON_EXCEPTION, null); 
     } catch (NoSuchAlgorithmException e) { 
      this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_NO_SUCH_ALGO_EXCEPTION, null); 
     } 

     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 
     if(this.progressDialog != null && this.progressDialog.isShowing()) { 
      this.progressDialog.dismiss(); 
     } 

     try { 
      if (json.getString(Globals.JSON_KEY_CODE) != null) { 
       if(json.getString(Globals.JSON_KEY_CODE).equals(Globals.JSON_STATUS_REGISTRATION_COMPLETED)) { 
        JSONObject jsonUser = json.getJSONObject(Globals.JSON_KEY_USER); 

        this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_OK, jsonUser); 
       } else if (json.getString(Globals.JSON_KEY_CODE).equals(Globals.JSON_STATUS_USER_ALREADY_EXISTS)) { 
        this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_EMAIL_ALREADY_EXISTS, null); 
       } else if (json.getString(Globals.JSON_KEY_CODE).equals(Globals.JSON_STATUS_DB_CONNECTION_FAILED)) { 
        this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_DB_CONNECTION_FAILED, null); 
       } else { 
        this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_CONNECTION_FAILED, null); 
       } 
      } 
     } catch (JSONException e) { 
      this.onRegisterTaskCompleted.onRegisterTaskCompleted(Globals.STATUS_JSON_EXCEPTION, null); 
     } 
    } 
} 

Это моя активность:

public class RegisterActivity extends Activity implements OnClickListener, OnCheckedChangeListener, OnRegisterTaskCompleted { 
    private EditText textEditFirstName = null; 
    private EditText textEditLastName = null; 
    private EditText textEditEmail = null; 
    private CheckBox checkBoxShowPassword = null; 
    private EditText textEditPassword = null; 
    private Button buttonRegister = null; 
    private Button buttonCancel = null; 

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

     this.setContentView(R.layout.activity_register); 

     this.textEditFirstName = (EditText) this.findViewById(R.id.register_textedit_firstname); 
     this.textEditLastName = (EditText) this.findViewById(R.id.register_textedit_lastname); 
     this.textEditEmail = (EditText) this.findViewById(R.id.register_textedit_email); 
     this.checkBoxShowPassword = (CheckBox) this.findViewById(R.id.register_checkbox_password); 
     this.checkBoxShowPassword.setOnCheckedChangeListener(this); 
     this.textEditPassword = (EditText) this.findViewById(R.id.register_textedit_password); 
     this.buttonRegister = (Button) this.findViewById(R.id.register_button_register); 
     this.buttonRegister.setOnClickListener(this); 
     this.buttonCancel = (Button) this.findViewById(R.id.register_button_cancel); 
     this.buttonCancel.setOnClickListener(this); 

     this.restoreState(savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putString(Globals.KEY_FIRSTNAME, this.textEditFirstName.getText().toString()); 
     outState.putString(Globals.KEY_LASTNAME, this.textEditLastName.getText().toString()); 
     outState.putString(Globals.KEY_EMAIL, this.textEditEmail.getText().toString()); 
     outState.putString(Globals.KEY_PASSWORD, this.textEditPassword.getText().toString()); 
     outState.putBoolean(Globals.KEY_SHOW_PASSWORD, this.checkBoxShowPassword.isChecked()); 
    } 

    @Override 
    public void onClick(View view) { 
     switch(view.getId()) { 
      case R.id.register_button_register : { 
       this.performRegister(); 
      } break; 
      case R.id.register_button_cancel : { 
       this.performCancel(); 
      } break; 
     } 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (!isChecked) { 
      this.textEditPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
     } else { 
      this.textEditPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
     } 
    } 

    @Override 
    public void onRegisterTaskCompleted(int status, JSONObject jsonUser) { 
     switch(status) { 
      case Globals.STATUS_OK : { 
       Toast.makeText(this, this.getResources().getString(R.string.message_registration_completed), Toast.LENGTH_LONG).show(); 

       this.finish(); 
      } break; 
      case Globals.STATUS_EMAIL_ALREADY_EXISTS : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_email_already_exists)); 
      } break; 
      case Globals.STATUS_DB_CONNECTION_FAILED : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_db_connection_failed)); 
      } break; 
      case Globals.STATUS_CONNECTION_FAILED : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_connection_failed)); 
      } break; 
      case Globals.STATUS_PROTOCOL_EXCEPTION : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_protocol_exception)); 
      } break; 
      case Globals.STATUS_IO_EXCEPTION : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_io_exception)); 
      } break; 
      case Globals.STATUS_JSON_EXCEPTION : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_json_exception)); 
      } break; 
      case Globals.STATUS_NO_SUCH_ALGO_EXCEPTION : { 
       DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_error), this.getResources().getString(R.string.message_algorithm_exception)); 
      } break; 
     } 

     this.buttonRegister.setEnabled(true); 
     this.buttonCancel.setEnabled(true); 
    } 

    private void restoreState(Bundle inState) { 
     if(inState != null) { 
      this.textEditFirstName.setText(inState.getString(Globals.KEY_FIRSTNAME)); 
      this.textEditLastName.setText(inState.getString(Globals.KEY_LASTNAME)); 
      this.textEditEmail.setText(inState.getString(Globals.KEY_EMAIL)); 
      this.textEditPassword.setText(inState.getString(Globals.KEY_PASSWORD)); 
      this.checkBoxShowPassword.setChecked(inState.getBoolean(Globals.KEY_SHOW_PASSWORD)); 
     } 
    } 

    private void performRegister() { 
     int result = this.checkFormFields(); 

     if(result == Globals.STATUS_OK) { 
      String firstname = this.textEditFirstName.getText().toString(); 
      String lastname = this.textEditLastName.getText().toString(); 
      String email = this.textEditEmail.getText().toString(); 
      String password = this.textEditPassword.getText().toString(); 

      this.buttonRegister.setEnabled(false); 
      this.buttonCancel.setEnabled(false); 

      RegisterTask registerTask = new RegisterTask(this, this, firstname, lastname, email, password); 
      registerTask.execute(this); 
     } else if(result == Globals.INPUT_MISSING_FN) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_missing_fn)); 
     } else if(result == Globals.INPUT_MISSING_LN) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_missing_ln)); 
     } else if(result == Globals.INPUT_MISSING_EMAIL) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_missing_email)); 
     } else if(result == Globals.INPUT_INVALID_EMAIL) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_invalid_email)); 
     } else if(result == Globals.INPUT_MISSING_PW) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_missing_pw)); 
     } else if(result == Globals.INPUT_INVALID_PASSWORD) { 
      DialogManager.showAlertDialog(this, this.getResources().getString(R.string.title_input_error), this.getResources().getString(R.string.message_invalid_pw)); 
     } 
    } 

    private void performCancel() { 
     this.finish(); 
    } 

    private int checkFormFields() { 
     if(this.textEditFirstName.getText().toString().trim().isEmpty()) { 
      return Globals.INPUT_MISSING_FN; 
     } else if(this.textEditLastName.getText().toString().trim().isEmpty()) { 
      return Globals.INPUT_MISSING_LN; 
     } else if(this.textEditEmail.getText().toString().trim().isEmpty()) { 
      return Globals.INPUT_MISSING_EMAIL; 
     } else if(!Validation.validateEmail(this.textEditEmail.getText().toString().trim())) { 
      return Globals.INPUT_INVALID_EMAIL; 
     } else if(this.textEditPassword.getText().toString().trim().isEmpty()) { 
      return Globals.INPUT_MISSING_PW; 
     } else if(!Validation.validatePassword(this.textEditPassword.getText().toString().trim())) { 
      return Globals.INPUT_INVALID_PASSWORD; 
     } else { 
      return Globals.STATUS_OK; 
     } 
    } 
} 

Когда я отловить исключение в методе doInBackground и я называю свой метод обратного вызова я получаю это ошибка:

Can't create handler inside thread that has not called Looper.prepare() 

Это ТОЛЬКО, когда я называю это doInBackground, так что я предполагаю, что это происходит потому, что диалогового и тостов сообщений на фоне потока. Мне нужно называть их в потоке пользовательского интерфейса. Мне нужно красивое решение для этого.

+0

эта ссылка не сказать мне что-нибудь, я не знаю еще, и это не связано с моим вопросом. – Mulgard

ответ

0

Вы называете это из рабочего потока. Либо вы можете позвонить Looper.prepare() из обработчика или использовать метод runOnUiThread так:

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     // your code goes here...for exception handling.. 
    } 
}); 
+0

ой, но тогда я должен дать активность как параметр моей AsyncTask. Разве это не «уродливый код»? – Mulgard

+0

да ... я думаю, что вы получаете ошибку. Toast.makeText() ... попробуйте использовать getApplicationContext() вместо «this» в методе makeText. – Riad

+0

Нет, я получаю сообщение об ошибке от DialogManager.showAlertDialog, и для этого мне нужно указать параметр «this». for 'this.getApplicationContext()' Я получаю сообщение об ошибке при вызове диалога. Тост не вызывает ошибку, потому что тост никогда не вызывается из doInBackground(). doInBackground вызывает только метод обратного вызова при появлении ошибки. Если все в порядке, метод callback вызывается в postExecute. – Mulgard

Смежные вопросы