Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问由AsyncTask填充的属性将返回null_Java_Android_Oop - Fatal编程技术网

Java 访问由AsyncTask填充的属性将返回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

我试图从我的用户类(保存登录用户的所有用户信息)中获取值。 它在登录后设置,并在日志中打印出来,但是当从实例化它的类调用时,它返回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");
        }
    }
我在类中有所有合适的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();