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 クラスでは、progressprogress をメソッド ブロックの外に置いたので、グローバル変数として宣言します。したがって、次の行:

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

のオブジェクトSyncDataが最初に作成されたとき、コンストラクターが呼び出される前に実行されます。コンストラクタがまだ呼び出されていないため、contextisnullを使用しようとするとエラーが発生します。

は の内部クラスであるため、LoginActivity.this代わりに使用するとcontext機能するため、内部クラス内からそのスコープにアクセスできます。SyncDataLoginActivity

を使用したい場合は、宣言contextの代入部分をコンストラクターの後のメソッドに移動してみてください。何かのようなもの:progressonPreExecute()

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 に答える