2012-08-31 11 views
6

これを動作させるにはかなり時間がかかりましたが、明らかにベストプラクティスではありません。要するに、AsyncTaskが終了したときにダイアログを表示する必要がありますが、getApplicationContext()が動作せず、AsyncTaskを作成するときにgetApplicationContext()をパラメータとして渡すこともありません。だから、私はAsyncTaskクラスのコンテキストのパブリック変数を宣言して、私は実行する前にそれを設定しました:Android AsyncTaskアクティビティのコンテキストへのアクセスの改善

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 

private class RefreshRefPoints extends AsyncTask<Context, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

    protected Integer doInBackground(Context... ctx) { 
     Log.d("H","doInBackground()"); 
     dbHelper.clearRefPoints(); 
     requestRefPoints(); 
     nPoints = parseRefPointsCSV(); 

     return nPoints; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 

    protected void onPreExecute() 
    { 
     pd = ProgressDialog.show(myCtx, "Refreshing Reference Points", "Loading...", true,false); 
     Log.d("H", "onPreExecute()"); 
    } 
    protected void onPostExecute(Integer result) { 
     pd.dismiss(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(myCtx); 
     builder.setTitle("Reference points refresh complete"); 
     builder.setMessage(result+" records loaded"); 
     builder.setPositiveButton("OK",null); 
     builder.show(); 
     Log.d("H","onPostExecute()");  
    }...etc 

は、誰もがちょうど私のコンテキストを渡すの正しい道を示すことはできますか?

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(Your_ActivityName.this); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 


private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

public RefreshRefPoints (Context ctx) { 
    myCtx = ctx; 
} 

答えて

12

としてコンストラクタで

おかげ

+1

しかし、それはメモリリークを与える –

2

パス・コンテキストは、コンストラクタメソッドを定義し、コンテキストにパラメータを渡します。それが良いだろう。

私が何を意味するのか。ここ

private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    private Context myCtx; 
    private ProgressDialog pd; 

    public RefreshRefPoints(Context ctx){ 
     // Now set context 
     this.myCtx = ctx; 
    } 

} 

すべてです。

+0

ありがとうございます。私はあなたのサンプルごとに "AsyncTask を拡張"という行を "AsyncTask

+1

put ** Void ** in protected Integer doInBackground(** Void ** ...){ –

+0

フラグメントを使用してすべてを行う現代的なコンテキストでは、この回答の価値は低下しています。 – ed209

10

アクティビティContextを参照する場合は、YourActivityName.thisを使用することもできます。アクティビティはコンテキストを拡張するので、そうすることが有効です。

+0

ありがとう - 気づいていない! –

+1

あなたのアクティビティがインスタンス化されていないか、または殺されていない場合、この答えのコードを呼び出すとNullPointerExceptionが発生することに注意してください。 –

関連する問題