我正在尝试从我的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());
}
}
以下是模拟器上的内容:
我花了最后一天半寻找解决方案,但空洞了。请你帮忙吗?
答案 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
课程中使用单身设计模式解决了这个问题。如果他们遇到同样的问题,人们可以通过这样的方式来解决这个问题!
欢呼并感谢所有回复!