从 AsyncTask 返回数据导致空指针错误

发布于 2024-09-10 17:02:06 字数 3003 浏览 2 评论 0原文

我正在尝试执行我认为相当简单的任务来对我的服务器上的用户进行身份验证。我使用 AsyncTask 作为 Activity 的私有子类,但是当我在验证后尝试填充用户对象时,它始终将其设置为 null。 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/[email protected]&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);
        }

    }

}

I am trying to do what I think is a fairly simple task to authenticate a user on my server. I am using AsyncTask as a private subclass of my Activity, however when I try to populate the user object after authenticating it keeps setting it to null. Is there something strange in how the onPostExecute() method is called that is causing this? I originally had the AsyncTask as its own class but ran into the same problem, so I am try to solve this using a private subclass. Any help? Thanks.

Here is my code:

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/[email protected]&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);
        }

    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆伤 2024-09-17 17:02:06

应该是

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

您尝试在 AsyncTask 创建之前访问 user (重点是 doInBackground(..) 在后台运行因此线程不会阻塞 UI 线程)。

Should be

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

You are trying to access user before it's been created by AsyncTask (the whole point is that doInBackground(..) runs in a background thread therefore not blocking the UI thread).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文