Java 访问由AsyncTask填充的属性将返回null
我试图从我的用户类(保存登录用户的所有用户信息)中获取值。 它在登录后设置,并在日志中打印出来,但是当从实例化它的类调用时,它返回null?下面是代码:Java 访问由AsyncTask填充的属性将返回null,java,android,oop,Java,Android,Oop,我试图从我的用户类(保存登录用户的所有用户信息)中获取值。 它在登录后设置,并在日志中打印出来,但是当从实例化它的类调用时,它返回null?下面是代码: public ApiConnector api; public String ID; public String USERNAME = null; public String NAME = null; public String LASTNAME = null; public String PASSWORD = null; public Str
public ApiConnector api;
public String ID;
public String USERNAME = null;
public String NAME = null;
public String LASTNAME = null;
public String PASSWORD = null;
public String EMAIL = null;
public User(String id) {
this.ID = id;
this.api = new ApiConnector();
new GetUserDataClass().execute(api);
}
private class GetUserDataClass extends AsyncTask<ApiConnector,Boolean,JSONArray> {
@Override
protected JSONArray doInBackground(ApiConnector... params) {
return params[0].getAllUserData(ID);
}
@Override
protected void onPostExecute(JSONArray jsonArray) {
if(jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject json = null;
try {
json = new JSONObject();
json = jsonArray.getJSONObject(i);
if(!json.getString("username").isEmpty()) {
setUsername(json.getString("username"));
Log.d("username", getUsername());
}
if(!json.getString("firstname").isEmpty()) {
setName(json.getString("firstname"));
Log.d("name", getName());
}
if(!json.getString("lastname").isEmpty()) {
setLastName(json.getString("lastname"));
Log.d("lastname", getLastName());
}
if(!json.getString("email").isEmpty()) {
setEmail(json.getString("email"));
Log.d("email", getEmail());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} else {
Log.d("hey", "hey");
}
}
我在类中有所有合适的getter和setter(正如您在上面的代码中看到的,工作正常)
以下是菜单类(返回空值):
以下是它在emulator上的外观:
我花了一天半的时间寻找解决方案,但结果是空的。请您帮忙好吗?您正在异步任务中加载用户数据……这很好,因为它似乎执行了一些网络操作 这意味着用户数据加载是异步执行的…因此不能立即使用 您在AsyncTask中有一个回调
onPostExecute
:使用它来更新UI,代码如下:
//you need to initialize it in the AsyncTask constrtuctor
final Activity myActivity;
@Override
protected void onPostExecute(JSONArray jsonArray) {
//json parsing code
//...
//and finally update the UI
new Handler(Looper.getMainLooper()).post(
new Runnable(){
public void run(){
TextView tvusername = (TextView) myActivity.findViewById(R.id.tvUsername);
tvusername.setText(ID + " " + getEmail());
}
}
);
}
你可以用
new GetUserDataClass().execute(api).get();
因此,系统将等待完成AsyncTask。您将获得id。我认为您在设置数据时忘记在用户类对象创建中使用静态word。
另一方面,它每次都会创建新实例,并且该对象不会显示您的数据。我通过在我的
用户
类中使用Singleton设计模式解决了它。这样,如果人们遇到同样的问题,就可以查找它来解决这个问题
干杯并感谢所有回复!您能告诉我们您的方法getEmail()在做什么吗?创建一个pojo类并传递类对象,然后再试一次。我希望mite能解决您的问题。它正在返回电子邮件,如logcat中所示instantiated@RajeshM什么是pojo类?具有私有变量和公共get()集()的类方法i,e:'public class MyBean{private String someProperty;public String getSomeProperty(){return someProperty;}public void setSomeProperty(String someProperty){this.someProperty=someProperty;}}'“活动没有响应"此解决方案崩溃。此外:在整个网络操作过程中,UI将无响应。这不起作用,我还必须尝试捕获。这给了我以下错误:
处理程序无法解析为类型
导入android.os.Handler
,您还需要将活动传递给您的异步任务这样你就可以调用findViewById
(我将编辑我的帖子),但我需要能够通过应用程序使用user.getName();
等,现在只需onPostExecute()
你不能。正如所解释的:用户数据不是立即可用的,因此你必须在应用程序代码中处理好这一点。就像在PHP中一样,我可以创建一个类来保存所有数据,以便在以后的阶段引用。我正在用户类中设置变量,应该能够从另一个类调用这些变量,就像方法一样,它们返回在类中设置的变量,所以我应该能够这样做。为什么否决投票?这是一种解决它的方法?我是问题的海报?
//you need to initialize it in the AsyncTask constrtuctor
final Activity myActivity;
@Override
protected void onPostExecute(JSONArray jsonArray) {
//json parsing code
//...
//and finally update the UI
new Handler(Looper.getMainLooper()).post(
new Runnable(){
public void run(){
TextView tvusername = (TextView) myActivity.findViewById(R.id.tvUsername);
tvusername.setText(ID + " " + getEmail());
}
}
);
}
new GetUserDataClass().execute(api).get();