ProgressDialog لا يعمل في Asynctask الخارجي
-
21-09-2019 - |
سؤال
لقد بدأت أعتقد أنه للحصول على ProgressDialog للعمل ، يجب أن يكون 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 -----
ما الخطأ الذي افعله؟
السيد Snowflake ،
حاول:
@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 حيث لا يتم إرجاع أي نتيجة من Asynctask عند اكتماله.
تحديث: حاول إنشاء فصل خاص في فئة الاتصال. لا يزال لا يمكن إظهار ProgressDialog. أحد الأخطاء هو: غير قادر على إضافة نافذة - الرمز المميز ليس للتطبيق. ليس لدي أي فكرة عما يشار إليه الرمز المميز.
المحلول 2
لقد تخليت عن Asynctask واستخدمت معالجًا للتعامل مع الخيط. كل شيئ بخير.
لست متأكدًا مما إذا كان هذا خطأ في 1.5 مع Asynctask أو أي شيء آخر لم أفعله.
نصائح أخرى
هل فكرت في تجاوز طريقة oncreatedialog () لتنفيذ الحوار الخاص بك؟ من السهل إنشاءها والتحكم فيها بهذه الطريقة لأن Android يقوم بمعظم العمل من أجلك. لدي مثال أدناه أفعل ما تحاول القيام به بالضبط.
كنت أواجه نفس المشكلة مثل OP لبعض الوقت مع Asynctask (خارجي). عند البحث في رسالة الخطأ "حاولت إضافة نافذة برمز غير تطبيق" ، اكتشفت أن المشكلة في تحديد السياق الذي يتم تمريره في مُنشئ المراهنات. السياق الذي يجب أن يتم تمريره هو "هذا" ، وليس this.getApplicationContext () أو this.getBaseContext (). التي حلت مشكلتي.
حاول الجري
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
كحجة قابلة للتشغيل كحجة للنشاط. 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");
}
};