我花了很长时间才让它起作用,但这显然不是最佳实践。简而言之,我需要在我的 AsyncTask 完成时显示一个对话框,但 getApplicationContext() 不起作用,在创建 AsyncTask 时也不会将其作为参数传递。所以我在我的 AsyncTask 类中为上下文声明了一个公共(public)变量,并在我执行之前设置它:
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 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;
}
}
就这些。
关于Android AsyncTask 访问 Activity Context 的更好方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12214364/