上下文和这个android

时间:2013-03-07 09:22:02

标签: android this android-context

我对'context'和'this'感到困惑,我不确定为什么下面的例子不起作用。

我尝试从LoginActivity中调用以下子类:

new SyncData(LoginActivity.this).execute(); // This will failed

public class SyncData  extends AsyncTask <Void, Void, String> {
    private Context context;
    public SyncData(Context context){
        this.context = context;
    } 
    ProgressDialog progress=ProgressDialog.show( context, "", "Please wait...", true); //NOT WORK!!!
}

但如果我说改为这一行就行了:

ProgressDialog progress=ProgressDialog.show( LoginActivity.this, "", "Please wait...", true); // This will work

如果我想将子类放在新的类文件中,有人可以向我解释如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

这是因为当您尝试显示ProgressDialog时,context类的SyncData参数未初始化。在调用SyncData构造函数之前初始化对象参数。

答案 1 :(得分:0)

在AsyncTask类中,将progress进度声明为全局变量,因为已将其放在方法块之外。因此,行:

ProgressDialog progress=ProgressDialog.show( context, "", "Please wait...", true);
首次创建SyncData的对象时,在调用构造函数之前执行

。由于您的构造函数尚未调用,contextnull,因此在您尝试使用它时会导致错误。

使用LoginActivity.this代替context有效,因为SyncDataLoginActivity的内部类,因此您可以从内部类中访问其范围。

如果要使用context,请尝试将progress声明的赋值部分移动到构造函数之后的方法中,例如onPreExecute()。类似的东西:

public class SyncData  extends AsyncTask <Void, Void, String> {
    private Context context;
    ProgressDialog progress;
    public SyncData(Context context){
        this.context = context;
    } 

    protected void onPreExecute() {
        progress=ProgressDialog.show( context, "", "Please wait...", true);
    }

}