我创建了这个AsyncTask内部类,现在我想把它变成外层。这是代码:
private class DownloadDataFromServer extends AsyncTask<String, Integer, String> {
ProgressDialog dialog;
boolean connErr = false;
boolean soErr = false;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(HomePage.this); !!!!PROBLEM!!!!
dialog.setIndeterminate(false);
dialog.setMax(100);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.setTitle("Download");
dialog.setMessage("Updating...");
dialog.show();
super.onPreExecute();
}
@Override
protected String doInBackground(String... urls) {
// do something
}
protected void onProgressUpdate(Integer... progress) {
// Update the progress
dialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) {
if (connErr || soErr) {
String msg = "Bad connection";
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(HomePage.this); !!!!PROBLEM!!!!
builder.setCancelable(false);
builder.setTitle("Connection timeout");
builder.setMessage(msg);
builder.setPositiveButton("Retry", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
new DownloadDataFromServer().execute(new String[] { "http://www.example.com" });
}
});
builder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish(); !!!!PROBLEM!!!!
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
if (Integer.parseInt(result) <= 0) {
Toast.makeText(getBaseContext(), "Error!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!!
} else {
Toast.makeText(getBaseContext(), "OK!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!!
}
}
dialog.dismiss();
}
}
请注意&#34; !!!!问题!!!!&#34;上面代码中的字符串:我得到的所有错误。我试图应用一些解决方法,但最后我无法使其工作。另外我还必须使用
private Database db = new Database(this);
但我不知道应该用什么代替&#34;这个&#34;。请帮我以正确的方式转换这个内部类。
答案 0 :(得分:5)
您应该将一个参数constructor
设为DownloadDataFromServer
类,并将上下文作为参数传递,如
Context mCon;
public DownloadDataFromServer(Context con){
this.mCon=con;
}
并将此mCon
上下文用于您DownloadDataFromServer
中的任何位置
builder = new AlertDialog.Builder(mCon);
最后从任何DownloadDataFromServer
中调用Activity
new DownloadDataFromServer(your_Activity.this).execute(......);
答案 1 :(得分:2)
让你DownloadDataFromServer
让构造函数接受HomeScreen
,将主屏幕保存在构造函数的字段中,然后在任何地方使用该字段而不是HomeScreen.this
。
由于这个原因,您可能必须公开HomeScreen
个私人字段(或提供访问者)。
你不想做那么多,有什么好处?