Какова цель оператора return в doInBackground () ASynctask? - PullRequest
3 голосов
/ 30 марта 2012

Этот аспект моей системы входа в систему работает нормально, если для оператора 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 ]

2 голосов
/ 30 марта 2012

Цель состоит в том, чтобы передать результат вашей работы (которая выполняется в рабочем потоке) в onPostExecute, чтобы обработать результат в потоке пользовательского интерфейса. Это необходимо, если вы хотите обновить пользовательский интерфейс в ответ на успешное выполнение задания.

2 голосов
/ 30 марта 2012

DoInBackground возвращает значение в метод postExecute, и передача значения null не проверяет условие:

if(headerCode == 202)
activity.login(id);
1 голос
/ 30 марта 2012
protected class InitTask extends AsyncTask<Context, Integer, Integer>

В строке выше мы определяем наш подкласс и три параметра, которые будут переданы обратным вызовам.Обратные вызовы выглядят так:

doInBackground ()

@Override
protected Integer doInBackground( Context... params )  {
     return super.doInBackground( params )
}

Все, что обрабатывается этим методом, обрабатывается в отдельном потоке. Обратите внимание, что тип данных возвращаемого значения является целым числом и соответствует третьему параметру типа в определении класса.Это значение, возвращаемое этим методом, передается методу onPostExecute (), когда этот поток завершает .

. И если вы передаете null в ответ , то условие не выполняется в методе onPostExecuted()

1 голос
/ 30 марта 2012

Да, это значение, которое вы отправляете postExecute:

http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)

protected void onPostExecute (Результат результата)

Запускается в потоке пользовательского интерфейсапосле doInBackground (Params ...).

Указанным результатом является значение, возвращаемое doInBackground (Params ...).

Этот метод не будет вызван, если задача была отменена.

Параметры: result Результат операции, вычисленный doInBackground (Params ...).

...