Я сталкивался с этим примером Android , который запускает AsyncTask из потока пользовательского интерфейса.Класс ExportDatabaseTask объявлен и создан в Activity, и, по-видимому, можно ссылаться на контекст пользовательского интерфейса действия из событий onPreExecute и onPostExecute, например:
public class ManageData extends Activity {
private ExportDatabaseTask exportDatabaseTask;
[...]
@Override
public void onCreate(final Bundle savedInstanceState) {
[...]
ManageData.this.exportDatabaseTask = new ExportDatabaseTask();
ManageData.this.exportDatabaseTask.execute();
[...]
}
private class ExportDatabaseTask extends AsyncTask<String, Void, Boolean> {
private final ProgressDialog dialog = new ProgressDialog(ManageData.this);
protected void onPreExecute() {
this.dialog.setMessage("Exporting database...");
this.dialog.show();
}
protected Boolean doInBackground(final String... args) {
[...]
}
protected void onPostExecute(final Boolean success) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
}
}
Я пытаюсь реорганизовать это, чтобыExportDatabaseTask объявлен в другом классе, который не является Activity, по разным причинам, и я не могу понять, как заставить его работать.Мне не хватает некоторых базовых концепций Java, которые я с готовностью признаю.
В частности, myActivity имеет значение null в onPreExecute ().Почему это так?
// this is a click event handler in my activity that starts the export
public void onClick(View v) {
Exporter ex = new Exporter(getApplicationContext(), ActivityMain.this);
ex.exportDatabaseTask.execute();
}
//this is the utility class
public class Exporter {
public ExportDatabaseTask exportDatabaseTask;
private Context myContext;
private ActivityMain myActivity;
public Exporter(Context ctx, ActivityMain act) {
myContext = ctx;
myActivity = act;
this.exportDatabaseTask = new ExportDatabaseTask();
}
public class ExportDatabaseTask extends AsyncTask<Void, Void, Boolean> {
private final ProgressDialog dialog = new ProgressDialog(myContext);
// can use UI thread here?
protected void onPreExecute() {
// ====> this throws a Nullpointer exception:
myActivity.dialog.setMessage("Exporting database...");
myActivity.dialog.show();
}
protected Boolean doInBackground(final Void... args) {
}
protected void onPostExecute(final Boolean success) {
if (myActivity.dialog.isShowing()) {
myActivity.dialog.dismiss();
}
}
}
}
Я понимаю, что могу взять код из событий pre и post-execute и поместить его в обработчик onclick в своей деятельности, избегая этого вопроса, но мне все еще интересно, почемукод выше не работает.