访问由AsyncTask填充的属性将返回null

时间:2014-05-19 13:39:47

标签: java android oop

我正在尝试从我的User类中获取值(保存登录用户的所有用户信息)。 它一旦登录就会被设置,并且它在日志中打印出来就好了,但是当从实例化它的类调用时,它返回null?这是代码:

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");
        }
    }

logcat输出为:

05-19 02:03:55.996: W/EGL_emulation(4367): eglSurfaceAttrib not implemented
05-19 02:03:55.996: D/username(4367): Me
05-19 02:03:55.996: D/name(4367): Me
05-19 02:03:55.996: D/lastname(4367): Mememe
05-19 02:03:55.996: D/email(4367): me@example.com

我在课堂上有适当的getter和setter(正如你在上面的代码中看到的那样,工作正常。

这是Menu类(返回null):

public class Menu extends Activity {

private String ID;
private User user;
public TextView tvusername;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    init();
}
public void init() {
    Bundle bundle = getIntent().getExtras();
    ID = bundle.getString("id");
    user = new User(ID);
    tvusername = (TextView) findViewById(R.id.tvUsername);
    tvusername.setText(ID + " " + user.getEmail());     
}   
}

以下是模拟器上的内容:

enter image description here

我花了最后一天半寻找解决方案,但空洞了。请你帮忙吗?

4 个答案:

答案 0 :(得分:0)

您正在AsyncTask中加载用户数据......这很好,因为它似乎执行了一些网络操作。

这意味着用户数据加载是异步执行的...因此无法立即执行。

你在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());
             }
         }
     );
}

答案 1 :(得分:0)

你可以使用

    new GetUserDataClass().execute(api).get(); 

这样系统就会等待完成AsyncTask。你会得到身份证。

答案 2 :(得分:-1)

我认为您在设置数据时忘记在User类对象创建中使用静态字。 另外,它每次都会创建新实例,并且该对象不会显示您的数据。

答案 3 :(得分:-1)

我在User课程中使用单身设计模式解决了这个问题。如果他们遇到同样的问题,人们可以通过这样的方式来解决这个问题!

欢呼并感谢所有回复!