Какова цель оператора return в doInBackground() ASynctask?
Этот аспект моей системы входа в систему работает очень хорошо, если у меня есть оператор return, установленный на 0 или 1, но не работает, если я использую ноль. Все это адаптировано из http://256design.com/blog/android-login-asynctask/ где это конкретное возвращение выглядит так, как указано ниже моего собственного кода.
public LoginTask(Polling activity, ProgressDialog progressDialog)
{
this.activity = activity;
this.progressDialog = progressDialog;
}
protected Integer doInBackground(String... arg0) {
EditText userName = (EditText)activity.findViewById(R.id.emailEditText);
EditText passwordEdit = (EditText)activity.findViewById(R.id.passEditText);
String email = userName.getText().toString();
String password = passwordEdit.getText().toString();
UserFunctions userFunction = new UserFunctions();
JSONObject json = userFunction.loginUser(email, password);
progressDialog.dismiss();
// check for login response
//Log.v("test", Integer.toString(jsonParser.getResponseCode()));
try {
if (json.getString(KEY_SUCCESS) != null) {
//loginErrorMsg.setText("");
//loginFragment.loginErrorMsg.setText("Success");
String res = json.getString(KEY_SUCCESS);
if(Integer.parseInt(res) == 1){
//user successfully logged in
// Store user details in SQLite Database
DatabaseHandler db = new DatabaseHandler(activity.getApplicationContext());
JSONObject json_user = json.getJSONObject("user");
//Log.v("name", json_user.getString(KEY_NAME));
// Clear all previous data in database
userFunction.logoutUser(activity.getApplicationContext());
db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL),
json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));
// Close Login Screen
//finish();
//loginErrorMsg = (TextView)activity.findViewById(R.id.loginErrorMsg);
//loginErrorMsg.setText("logged in");
//passwordEdit.setText("");
}else{
// Error in login
//progressDialog.setMessage("Incorrect username or password");
//loginErrorMsg.setText("Incorrect username/password");
}
}
} catch (NullPointerException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
return 1;
}
Учебник, который я использовал, взгляните на responseCode:
protected Integer doInBackground(String... arg0)
{
String result = "";
int responseCode = 0;
try
{
HttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.256design.com/projectTransparency/project/headerLogin.php");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("emailAddress", arg0[0]));
nameValuePairs.add(new BasicNameValuePair("password", arg0[1]));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
int executeCount = 0;
HttpResponse response;
do
{
progressDialog.setMessage("Logging in.. ("+(executeCount+1)+"/5)");
// Execute HTTP Post Request
executeCount++;
response = client.execute(httppost);
responseCode = response.getStatusLine().getStatusCode();
// If you want to see the response code, you can Log it
// out here by calling:
// Log.d("256 Design", "statusCode: " + responseCode)
} while (executeCount < 5 && responseCode == 408);
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
String line;
while ((line = rd.readLine()) != null)
{
result = line.trim();
}
id = Integer.parseInt(result);
}
catch (Exception e) {
responseCode = 408;
e.printStackTrace();
}
return responseCode;
}
4 ответа
Цель состоит в том, чтобы передать результат вашей работы (который выполняется в рабочем потоке) onPostExecute
, чтобы обработать результат в потоке пользовательского интерфейса. Это необходимо, если вы хотите обновить пользовательский интерфейс в ответ на успешное выполнение задания.
DoInBackground возвращает значение в метод postExecute, и передача значения null не проверяет условие:
if(headerCode == 202)
activity.login(id);
protected class InitTask extends AsyncTask<Context, Integer, Integer>
В строке выше мы определяем наш подкласс и три параметра, которые будут переданы обратным вызовам. Обратные вызовы выглядят так:
doInBackground ()
@Override
protected Integer doInBackground( Context... params ) {
return super.doInBackground( params )
}
Все, что обрабатывается этим методом, обрабатывается в отдельном потоке. Обратите внимание, что тип данных возвращаемого значения является целым числом и соответствует третьему параметру типа в определении класса. Это значение, возвращаемое этим методом, передается методу onPostExecute() по завершении этого потока.
И если вы передаете нуль в ответ, то это не выполняется условие для метода onPostExecuted()
Да, это значение, которое вы отправляете postExecute
:
http://developer.android.com/reference/android/os/AsyncTask.html)
protected void onPostExecute(Результат результата)
Запускается в потоке пользовательского интерфейса после doInBackground(Params...).
Указанный результат является значением, возвращаемым doInBackground(Params...).
Этот метод не будет вызван, если задача была отменена.
Параметры: result Результат операции, вычисленный doInBackground(Params...).