ProgressDialog не работает во внешней Asynctask
-
21-09-2019 - |
Вопрос
Я начинаю думать, что для того, чтобы привлечь прогресс для работы, Asynctask должен быть внутренним классом в классе деятельности. Истинный? [Отредактировано намного позже ... Ответ ложный, и я не уверен, что это ошибка или что -то в этом роде. Я использую Android 1.5. Я собираюсь прочитать об услугах.
У меня есть деятельность, которую использует базу данных для манипулирования информацией. Если база данных заполнена, все хорошо. Если он не заполнен, то мне нужно загрузить информацию с веб -сайта, заполнить базу данных, а затем получить доступ к заполненной базе данных, чтобы завершить представления в Oncreate.
Проблема без каких -либо средств, чтобы определить, когда поток Asynctask завершил заполнение базы данных, я получаю следующее сообщение об ошибке за закрытие силы: Извините! Приложение неожиданно остановилось. Я нажимаю на кнопку «Закрыть сил», фоновая поток Asynctask продолжает работать, база данных заполняется, и все работает нормально.
Мне нужно избавиться от этого сообщения об ошибке, и мне нужна помощь в том, как это сделать. Вот какой -то код PSUedo:
public class ViewStuff extends Activity
{
onCreate
{
if(database is populated)
do_stuff
else
{
FillDB task = null;
if(task == null || task.getStatus().equals(AsyncTask.Status.FINISHED))
{
task = new FillDB(context);
task.execute(null);
}
}
continue with onCreate using information from database to properly display
} // end onCreate
} // end class
В отдельном файле:
public class FillDB extends AsyncTask<Void, Void, Void>
{
private Context context;
public FillDB (Context c) //pass the context in the constructor
{
context = c;
}
public void filldb ()
{
doInBackground();
}
@Override
protected void onPreExecute()
{
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
@Override
protected Void doInBackground(Void... params)
{
// TODO Auto-generated method stub
try
etc etc etc
}
}
Вот трассировка стека из эмулятора:
----- pid 846 at 2010-03-21 19:58:25 -----
Cmd line: com.trial
DALVIK THREADS:
"main" prio=5 tid=3 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x40018e70
| sysTid=846 nice=0 sched=0/0 handle=-1098855268
at android.os.BinderProxy.transact(Native Method)
at android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:2103)
at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:75)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884)
at dalvik.system.NativeStart.main(Native Method)
"Binder Thread #3" prio=5 tid=15 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x43733d88
| sysTid=852 nice=0 sched=0/0 handle=1486928
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #2" prio=5 tid=13 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x437313c8
| sysTid=851 nice=0 sched=0/0 handle=1492472
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #1" prio=5 tid=11 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x4372b9b0
| sysTid=850 nice=0 sched=0/0 handle=1492664
at dalvik.system.NativeStart.run(Native Method)
"JDWP" daemon prio=5 tid=9 VMWAIT
| group="system" sCount=1 dsCount=0 s=0 obj=0x4372a2a0
| sysTid=849 nice=0 sched=0/0 handle=1490176
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
| group="system" sCount=0 dsCount=0 s=0 obj=0x4372a1e8
| sysTid=848 nice=0 sched=0/0 handle=1487888
at dalvik.system.NativeStart.run(Native Method)
"HeapWorker" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 s=0 obj=0x427d03c0
| sysTid=847 nice=0 sched=0/0 handle=1487592
at dalvik.system.NativeStart.run(Native Method)
----- end 846 -----
Что я делаю не так?
Мистер Сновилька,
Пытался:
@Override
protected void onPreExecute()
{
Activity.this.runOnUiThread(new Runnable() {
public void run() {
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
});
}
Заявление. Это помечено как ошибка: нет приложения экземпляра типового действия не доступен по объему
Я думаю, что мне нужно FillDB Extends Activity, а затем создать частный класс в FillDB, расширяющий Asynctask? Это не будет работать. Нет гарантии, когда начнется активность FillDB, и не может использовать startActivityForResult, так как не возвращается из Asynctask после его завершения.
ОБНОВЛЕНИЕ: Попробовал создать частный класс в классе. До сих пор не могу показать прогресс. Одна из ошибок: невозможно добавить окно - токен нуль не для приложения. Я понятия не имею, на что упоминается токен.
Решение 2
Я отказался от Asynctask и использовал обработчик для обработки потока. Все хорошо.
Не уверен, что это ошибка в 1.5 с Asynctask или чем -то еще, что я не сделал.
Другие советы
Рассматривали ли вы переопределение метода Oncreatedialog () для реализации ваших диалогов? Это легко создавать и контролировать их таким образом, так как Android делает большую часть работы для вас. У меня есть пример ниже, который делает именно то, что вы пытаетесь сделать.
У меня была та же проблема, что и OP довольно давно с публичной (внешней) Asynctask. При исследовании сообщения об ошибке «попытка добавить окно с токеном без применения», я обнаружил, что проблема заключается в том, чтобы установить контекст, который передается в конструкторе Asynctask. Контекст, который должен быть передан, - это «это», а не это. GetApplicationContext () или this.getBaseContext (). Это решило мою проблему.
Попробуйте запустить
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
как запускаемый как аргумент в отношении Activity.runonuithread (). Элементы пользовательского интерфейса должны быть созданы и манипулировать в потоке пользовательского интерфейса. Я думаю, это также верно для Dialog
с
Редактировать] Код:
Activity.this.runOnUiThread(new Runnable() {
public void run() {
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
};