0

我对“上下文”和“这个”感到困惑,我不确定为什么下面的示例不起作用。

我尝试从我的 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

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

4

2 回答 2

0

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

于 2013-03-07T09:41:21.497 回答
0

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

ProgressDialog progress=ProgressDialog.show( context, "", "Please wait...", true);

在第一次创建对象时执行SyncData,并且在调用构造函数之前执行。由于尚未调用您的构造函数,contextis null,当您尝试使用它时会导致错误。

使用LoginActivity.this而不是context有效,因为SyncData它是 的内部类LoginActivity,因此您可以从内部类内部访问它的范围。

如果要使用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);
    }

}
于 2013-03-07T09:41:33.643 回答