从 AsyncTask 返回数据导致空指针错误
我正在尝试执行我认为相当简单的任务来对我的服务器上的用户进行身份验证。我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
应该是
您尝试在
AsyncTask
创建之前访问user
(重点是doInBackground(..)
在后台运行因此线程不会阻塞 UI 线程)。Should be
You are trying to access
user
before it's been created byAsyncTask
(the whole point is thatdoInBackground(..)
runs in a background thread therefore not blocking the UI thread).