Возврат данных из AsyncTask, приводящий к ошибке нулевого указателя - PullRequest
1 голос
/ 20 июля 2010

Я пытаюсь сделать то, что я считаю довольно простой задачей для аутентификации пользователя на моем сервере.Я использую AsyncTask в качестве частного подкласса моей Деятельности, однако, когда я пытаюсь заполнить пользовательский объект после аутентификации, он продолжает устанавливать его в нуль.Есть ли что-то странное в том, как вызывается метод onPostExecute (), который вызывает это?У меня изначально был AsyncTask в качестве собственного класса, но я столкнулся с той же проблемой, поэтому я пытаюсь решить эту проблему с помощью частного подкласса.Любая помощь?Спасибо.

Вот мой код:

public class Testing extends Activity {

    private User user;

    public User getUser() {
        return this.user;
    }

    public void setUser(User value) {
        this.user = value;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final ImageView iconImage = (ImageView) this.findViewById(R.id.image);
        final Button testButton = (Button) this.findViewById(R.id.testButton);
        final TextView text = (TextView) this.findViewById(R.id.text);
        iconImage.setImageResource(R.drawable.logo_real);
        testButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                LoginTask loginTask = (LoginTask) new LoginTask().execute(new Void[0]);
                text.setText(user.getFormattedFullName());
            }
        });
    }

    private class LoginTask extends AsyncTask<Void, Void, User> {

        public LoginTask() {
        }

        protected User doInBackground(Void... params) {
            User newUser = new User();
            try {
                System.out.println("testing task");
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet("http://10.0.2.2:8080/Dugout/androidLogin?LOGIN_ID=test@gmail.com&PASSWORD=password");
                HttpResponse response = client.execute(request);
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                String message = "";
                String inputLine = "";
                BufferedReader bf = new BufferedReader(new InputStreamReader(is));
                while ((inputLine = bf.readLine()) != null) message+=inputLine;
                JSONObject returnedUser = new JSONObject(message);
                int userId = returnedUser.getInt("userId");
                boolean loginSuccess = returnedUser.getBoolean("login_success");
                String firstName = returnedUser.getString("firstName");
                String lastName = returnedUser.getString("lastName");
                newUser.setId(userId);
                newUser.setFirstName(firstName);
                newUser.setLastName(lastName);
                newUser.setLoginSuccess(loginSuccess);
                return newUser;
            } catch (Exception e) {
                newUser.setLoginSuccess(false);
                return newUser;
            }
        }

        protected void onPostExecute(User user) {
            setUser(user);
        }

    }

}

1 Ответ

2 голосов
/ 20 июля 2010

Должно быть

protected void onPostExecute(User user) {
    text.setText(user.getFormattedFullName());
}

Вы пытаетесь получить доступ к user до того, как он был создан AsyncTask (суть в том, что doInBackground(..) работает в фоновом потоке, поэтому не блокирует поток пользовательского интерфейса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...