كيفية ترتيب إجراءات طويلة (تستغرق وقتا طويلا) على نظام Android؟

StackOverflow https://stackoverflow.com/questions/2241049

  •  19-09-2019
  •  | 
  •  

سؤال

على سبيل المثال، نحن في التظليل والنشاط لديه زر يستدعي الملفات المتحركة من DIR إلى آخر إلى آخر (دعونا نسميه وظيفة تكنولوجيا المعلومات).

على بلاك بيري أود:

  1. دفع نافذة منبثقة غير قابل للإلغاء (شاشة الحوار) تقول "يرجى الانتظار ..."
  2. بدء موضوع يلبي الوظيفة
  3. على إكمال موضوع إغلاق المنبثقة

هذا النهج 99.99٪ يمكن أن يضمن أننا نبقى على نفس الشاشة بعد انتهاء المهمة، يرى المستخدم فقط منبثق وينتظر الانتهاء من الوظيفة. دوران الجهاز أو أي شيء لا يكسر سير العمل المطلوب.

على أشياء أندرويد تتغير. أعلم أن هناك ASYNCTASK الذي يمكن توفيره لحل حالتي. هناك حتى جيدة مثال كيف يجب استخدامه. ولكن نظرا لعدم وجود ضمان إلى متى سيعيش مثيل النشاط، فيجب إلغاء ASYNCTASK على OnsaveInstanCestate (وإعادة تشغيله على OnRestoreInstanState). هذا يعني استخدام Asynctask لا يوجد أي ضمان نحن قادرون على تحقيق الوظيفة بالكامل. في بعض الحالات كإرسال طلب مشاركة HTTP لإنشاء مستخدم، لن أرغب في الحصول على مشكلة في "المستخدم موجود بالفعل" في إعادة تشغيل ASYNCTASK. هذا ممكن نظرا لأنه يمكن مقاطعة ASYNCTASK أثناء إرسال الطلب بالفعل (والخادم يقوم بالفعل بعمله - إنشاء مستخدم جديد)، ولكن يتم إلغاء ASYNCTASK قبل أن نحصل على الاستجابة.

هل هناك أي حل على نظام Android للحصول على سلوك BB الذي يشبه BB المذكورة أعلاه؟

هل كانت مفيدة؟

المحلول 3

في مايو 2010 أصدرت Google جلسة IO جديدة تسمى تطوير تطبيقات عميل الروبوت الراقي وهذا ما يفسر كيفية تحقيق ما طلبته بالضبط.

اتضح أن السؤال معقد إلى حد ما، لذلك لا يوجد حل سهل وسريع. الحل يتطلب معرفة عميقة من منصة Android / API. هذا هو الثمن الناجم عن مرونة عملية تطبيق العملية / نشاط التطبيق.

أشعر ببعض الغرابة حول سبب عدم تقديم هذه المعلومات من الإصدار الأول من Android. يبدو أن Google تعرف كيفية كتابة تطبيقات Bughless 100٪ وللم تشارك بعض السبب في التسويق النهج. فقط تخيل كم من تطبيقات عربات التي تجرها الدواب كتب بحلول مايو 2010.

على أي حال أنا سعيد الآن لدي SMTH نحن ندعو نهج أفضل الممارسات.

نصائح أخرى

ولكن نظرا لعدم وجود ضمان إلى متى سيعيش مثيل النشاط، فيجب إلغاء ASYNCTASK على OnsaveInstanCestate (وإعادة تشغيله على OnRestoreInstanState).

أو هل تم إدارتها من قبل Service.

إذا أراد نشاطك البقاء على الشاشة، فيمكنك ببساطة بدء موضوع مثل هذا:

final File fromFile = ...;
final File toFile = ...;

new Thread() {
    @Override
    public void run() {
      // do something with fromFile, toFile
    }
}.start();

وبهذه الطريقة، يعتقد خيط واجهة المستخدم الرسومية على استعداد للقيام بالآخرين مثل عرض

  android.app.ProgressDialog

أيضا، النظر في جعل مربع الحوار غير مقدم

  ProgressDialog.setCancelable(false);

بهذه الطريقة يمكن للمستخدم المغادرة فقط عبر المفتاح المنزلي، والذي تحصل عليه

  Activity.onPause()

يسمى. هل ترغب في البحث في Wakelocks، لإيقاف الشاشة من تحول اللون الأسود وطلبك في الخلفية حيث قد يقتل. كنت تفعل هذا في الخيط:

  PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
  Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
  wakeLock.acquire();

  // ... copy stuff ...

  wakeLock.release();

بالطبع يجب عليك إطلاق سراح Wakelock، أيضا، عندما يترك المستخدم عبر المفتاح المنزلي.

أخيرا إذا كنت ترغب في استدعاء عناصر واجهة المستخدم الرسومية من مؤشر ترابط الخلفية الخاص بك، فسيؤدي ذلك فقط إذا كان الخيط جزءا من حلقة Gui-Event-Event، مثل الخيط العادي هل أنت قيد التشغيل، عند الحصول على ما يسمى في ... -طرق. لتحقيق هذا الخلفية الخاص بك سوف تضطر إلى رد الاتصال بخيط واجهة المستخدم الرسومية عبر معالج. مثله:

  private Handler mHandler = new Handler() { 
      @Override
      public void handleMessage(Message msg) {
          Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
      // ... do GUI actions ...
      }    
  };

  // ... in Thread ...

  int lvInfo = 77;
  mHandler.sendEmptyMessage(lvInfo);

يمكنك حتى وضع كائنات في رسالة مثل ذلك:

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top