public static variable有值,但是当我尝试将它显示到textview(在另一个类中)时,它没有任何值

时间:2016-07-11 10:58:27

标签: android json static-variables

我的活动流程,登录页面 - >主页(在此我有一个按钮转到具有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();
}

1 个答案:

答案 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())