我的活动流程,登录页面 - >主页(在此我有一个按钮转到具有onclick方法的Userprofile) - >按钮onclick方法是" startactivity(Userprofile)"
我有onClick
方法加载活动Userprofile
。
我想加载用户的详细信息,我有一些static
变量,但没有运气。
public class Userprofile extends AppCompatActivity {
TextView textView , textView1 , textView2 ;
Context context_userprofile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userprofile);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
func_userprofile_show();
}
public void func_userprofile_show(){
String type = "linkuser";
DatabaseLink databaseLink = new DatabaseLink(this);
databaseLink.execute(type);
context_userprofile = getApplicationContext();
textView = (TextView)findViewById(R.id.tvprofilepage_user);
assert textView != null;
textView.setText(DatabaseLink.thename);
textView1 = (TextView)findViewById(R.id.tvprofilepage_ign);
assert textView1 != null;
textView1.setText(DatabaseLink.theign);
textView2 = (TextView)findViewById(R.id.tvprofilepage_emailid);
assert textView2 != null;
textView2.setText(DatabaseLink.theemail);
}
}
现在这是一个来自不同类的方法,它扩展了AsyncTask
和" theign"显示在AlertDialog
但未显示在TextView
。
public void decodejson() {
try {
JSONObject jsonObj = new JSONObject(myJSON);
details_json = jsonObj.getJSONArray(TAG_RESULTS);
for (int i = 0; i < details_json.length(); i++) {
JSONObject c = details_json.getJSONObject(i);
thename = c.getString(TAG_NAME);
theign= c.getString(TAG_IGN);
theemail = c.getString(TAG_EMAIL);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected void onPreExecute() {
alertDialog = new AlertDialog.Builder(context).create();
alertDialog.setTitle("User Profile Loading...");
}
@Override
protected void onPostExecute(String result) {
myJSON = result;
decodejson();
alertDialog.setMessage(theign);
alertDialog.show();
}
答案 0 :(得分:0)
问题是在AsyncTask完成之前调用了textView.setText。
要解决此问题,您可以实现一个接口,以便在信息准备就绪时调用活动内部的函数。 假设AsynkTask在您的DatabaseLink类中,我将播种一些伪代码。
接口:
public interface DatabaseLinkInterface {
public void databaseLinkFinished();
}
上下文也是听众。您在DatabaseLink类中有上下文:
@Override
protected void onPostExecute(String result) {
myJSON = result;
decodejson();
alertDialog.setMessage(theign);
alertDialog.show();
DatabaseLinkInterface mListener = (DatabaseLinkInterface) context;
mListener.databaseLinkFinished();
}
在您的活动中实现界面并在onCreate中创建DatabaseLink:
public class Userprofile extends AppCompatActivity implements DatabaseLinkInterface {
TextView textView , textView1 , textView2 ;
Context context_userprofile;
DatabaseLink databaseLink;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userprofile);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
String type = "linkuser";
databaseLink = new DatabaseLink(this);
databaseLink.execute(type);
}
...
最后,在您的活动中,实现接口方法以了解何时获取数据。删除func_userprofile_show()。 为此目的避免使用静态变量。
@Override
public void databaseLinkFinished(){
context_userprofile = getApplicationContext();
textView = (TextView)findViewById(R.id.tvprofilepage_user);
assert textView != null;
textView.setText(databaseLink.thename);
textView1 = (TextView)findViewById(R.id.tvprofilepage_ign);
assert textView1 != null;
textView1.setText(databaseLink.theign);
textView2 = (TextView)findViewById(R.id.tvprofilepage_emailid);
assert textView2 != null;
textView2.setText(databaseLink.theemail);
}
我还建议您使用getter和setter而不是直接访问该属性(databaseLink.theemail - &gt; databaseLink.getTheEmail())