كيف يمكنني تشغيل الكود على مؤشر ترابط الخلفية على نظام Android؟




multithreading (4)

أريد تشغيل بعض التعليمات البرمجية في الخلفية باستمرار. لا أريد أن أفعل ذلك في الخدمة. هل هناك أي طريقة أخرى ممكنة؟

لقد حاولت استدعاء فئة مؤشر Thread في نشاطي ولكن يبقى نشاطي في الخلفية لبعض الوقت ثم يتوقف. فئة مؤشر Thread أيضاً يتوقف عن العمل.

class testThread implements Runnable 
    {
        @Override
        public void run() 
        {
            File file = new File(Environment.getExternalStorageDirectory(),"/BPCLTracker/gpsdata.txt");
            int i=0;

        RandomAccessFile in = null;

        try
        {
            in = new RandomAccessFile(file, "rw");


        } 
        catch (FileNotFoundException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //String line =null;
        while (true) 
        {
            HttpEntity entity=null;
            try 
            {
                if (isInternetOn()) 
                {
                        while ((line = in.readLine()) != null)
                        {

                            HttpClient client = new DefaultHttpClient();
                            String url = "some url";
                            HttpPost request = new HttpPost(url);
                            StringEntity se = new StringEntity(line);
                            se.setContentEncoding("UTF-8");
                            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                            entity = se;
                            request.setEntity(entity);
                            HttpResponse response = client.execute(request);
                            entity = response.getEntity();
                            i++;
                        }
                        if((line = in.readLine()) == null && entity!=null)
                        {
                            file.delete();
                            testThread t = new testThread();
                            Thread t1 = new Thread(t);
                            t1.start();
                        }


                }// end of if
                else
                {
                    Thread.sleep(60000);

                } // end of else
            }// end of try
            catch (NullPointerException e1)
            {
                e1.printStackTrace();
            } 
            catch (InterruptedException e2) 
            {
                e2.printStackTrace();
            }
            catch (IOException e1) 
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }// end of while
    }// end of run

أريد تشغيل بعض التعليمات البرمجية في الخلفية باستمرار. لا أريد أن أفعل ذلك في الخدمة. هل هناك أي طريقة أخرى ممكنة؟

على الأرجح mechanizm أنك تبحث عن AsyncTask . انها مصممة مباشرة لأداء عملية الخلفية على خلفية الموضوع. كما أن الميزة الأساسية هي تقديم عدد قليل من الطرق التي تعمل على مؤشر ترابط (UI) الرئيسي وتجعلك قادرًا على تحديث واجهة المستخدم إذا كنت ترغب في إعلام المستخدم عن بعض التقدم في مهمة أو تحديث واجهة المستخدم مع البيانات المسترجعة من عملية الخلفية.

إذا كنت لا تعرف كيف تبدأ هنا هو تعليمي جيد:

ملاحظة: أيضا هناك إمكانية لاستخدام IntentService مع ResultReceiver الذي يعمل كذلك.


إذا كنت بحاجة إلى:

  1. تنفيذ التعليمات البرمجية على خلفية الموضوع

  2. تنفيذ التعليمات البرمجية التي لا تلمس / تُحدث واجهة المستخدم

  3. تنفيذ رمز (قصير) الذي سيستغرق في ثوان قليلة لإكمال

ثم استخدم النمط التالي النظيف والفعال الذي يستخدم AsyncTask:

AsyncTask.execute(new Runnable() {
   @Override
   public void run() {
      //TODO your background code
   }
});

بديل ل AsyncTask هو robospice. https://github.com/octo-online/robospice .

بعض ميزات robospice.

1.يتم تنفيذ طلبات الشبكة بشكل غير متزامن (في الخلفية AndroidService) (على سبيل المثال: طلبات REST باستخدام Spring Android). يخطر لك التطبيق ، على مؤشر ترابط واجهة المستخدم ، عندما تكون النتيجة جاهزة.

2. انها كتبت بقوة! يمكنك تقديم طلباتك باستخدام POJOs وتحصل على POJOs حسب نتائج الطلب.

3. لا تفرض أي قيود على POJOs المستخدمة للطلبات ولا على فئات النشاط التي تستخدمها في مشاريعك.

4.caches النتائج (في Json مع كل من جاكسون و Gson ، أو Xml ، أو ملفات نصية مسطحة ، أو الملفات الثنائية ، حتى باستخدام ORM Lite).

5. قم بإبلاغ نشاطاتك (أو أي سياق آخر) عن نتيجة طلب الشبكة إذا وفقط إذا كانت لا تزال على قيد الحياة

لا يؤدي تسرب الذاكرة على الإطلاق ، مثل Android Loaders ، على عكس Android AsyncTasks ، إلى الإبلاغ عن أنشطتك على مؤشر ترابط واجهة المستخدم.

7. يستخدم نموذج التعامل مع استثناء بسيط ولكن قوي.

عينات لتبدأ. https://github.com/octo-online/RoboSpice-samples .

عينة من robospice على https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result .


class Background implements Runnable {
    private CountDownLatch latch = new CountDownLatch(1);
    private  Handler handler;

    Background() {
        Thread thread = new Thread(this);
        thread.start();
        try {
            latch.await();
        } catch (InterruptedException e) {
           /// e.printStackTrace();
        }
    }

    @Override
    public void run() {
        Looper.prepare();
        handler = new Handler();
        latch.countDown();
        Looper.loop();
    }

    public Handler getHandler() {
        return handler;
    }
}




multithreading