ProgressDialog外部Asynctaskで動作しない
-
21-09-2019 - |
質問
私は、Asynctaskを動作させるためにProgressDialogを取得するためには、アクティビティクラス内の内部クラスでなければならないと考え始めています。真実? [ずっと編集された...答えは虚偽であり、これがバグなのか、それとも何なのかはわかりません。 Android 1.5を使用しています。私はサービスを読みます。
情報を操作するためにデータベースを使用するアクティビティがあります。データベースが入力されている場合、すべてが順調です。埋め立てられていない場合は、Webサイトから情報をダウンロードし、データベースに入力してから、人口のデータベースにアクセスして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を拡張する必要があると思っています。その後、filldb拡張asynctask内にプライベートクラスを作成しますか?それはうまくいきません。 FillDBアクティビティが開始され、StartActivityForresultを使用できない場合の保証なし。
更新:呼び出しクラスでプライベートクラスを作成しようとしました。まだ進行状況を示すことはできません。エラーの1つは、ウィンドウを追加できないことです。TokenNullはアプリケーション用ではありません。どのようなトークンが参照されているのかわかりません。
解決 2
私はasynctaskをあきらめ、ハンドラーを使用してスレッドを処理しました。すべてが良いです。
それが1.5のバグなのか、Asynctaskを使用してバグなのか、それとも私がしなかった他のことであるかどうかはわかりません。
他のヒント
ダイアログを実装するために、oncreatedialog()メソッドをオーバーライドすることを検討しましたか? Androidがあなたのためにほとんどの作業を行っているので、この方法でそれらを作成して制御するのは簡単です。以下に、あなたがやろうとしていることを正確に行う例があります。
私は、一般の(外部)Asynctaskでかなり長い間OPと同じ問題を抱えていました。 「非適応トークンでウィンドウを追加しようとした」エラーメッセージを調査するとき、問題はAsynctaskのコンストラクターに渡されているコンテキストを設定することであることがわかりました。渡す必要があるコンテキストは「this」であり、this.getApplicationContext()またはthis.getBaseContext()ではありません。それは私の問題を解決しました。
実行してみてください
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
Activity.runonuithread()の引数として実行可能として。ユーザーインターフェイス要素は、UIスレッドで作成および操作する必要があります。これも当てはまると思います Dialog
s。
編集]コード:
Activity.this.runOnUiThread(new Runnable() {
public void run() {
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
};