これを動作させるにはかなり時間がかかりましたが、明らかにベストプラクティスではありません。要するに、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;
}
しかし、それはメモリリークを与える –