سؤال

لقد بدأت أعتقد أنه للحصول على 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 يقوم بمعظم العمل من أجلك. لدي مثال أدناه أفعل ما تحاول القيام به بالضبط.

http://pastie.org/880540

كنت أواجه نفس المشكلة مثل 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");
  }
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top