2012-01-17 16 views
5

मेरे पास एक ऐसी सेवा है जो वेब से कुछ डेटा प्राप्त करती है और उस एप्लिकेशन को अपडेट करती है जो एप्लिकेशन में "संग्रहीत" होती है।बेस्ट-प्रैक्टिस: अद्यतन ArrayAdapter लगातार

इस प्रकार, मैं इसे मुख्य गतिविधि से एक्सेस कर सकता हूं और इसे अपने ऐरेएडाप्टर के लिए उपयोग कर सकता हूं।

जब मैं डेटा अपडेट करता हूं, सूची से संदर्भित आइटम बदल जाता है।

मेरा प्रश्न है, मुख्य गतिविधि में एडाप्टर में डेटा को अपडेट करने का सबसे अच्छा अभ्यास कैसा है?

मेरे पास दो समाधान हैं, लेकिन मुझे नहीं पता कि वे इस तरह से सही हैं या नहीं। इसके अतिरिक्त, मैं एक ऐसे संस्करण को कार्यान्वित करना चाहता हूं जो अधिक बैटरी का उपयोग नहीं कर रहा है!

पहले: धागा जो हर दूसरे कहा जाता है, notifyDataSetChanged() के साथ एडाप्टर अद्यतन करने:

private void startListUpdateThread() 
{ 
    Thread ListManageThread = new Thread() { 
     LinkItem listItem; 
     public void run() { 
      Log.d("DL", "List Update - start"); 
      while(true) 
      { 
       runOnUiThread(UpdateGUIList); 

       try { 
        Thread.sleep(1000); //5Sekunden! 
       } 
       catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Log.e("DL", "ERROR: InterruptedException - " + e.getMessage()); 
       } 
      } 
     } 
    }; 
    ListManageThread.start(); 
} 

private Runnable UpdateGUIList = new Runnable() { 

    @Override 
    public void run() { 
     mFileAdapter.notifyDataSetChanged(); 
    } 
};  

दूसरा: एक देरी हैंडलर पद का उपयोग करते हुए निजी अंतिम हैंडलर हैंडलर = नया हैंडलर();

private void startListUpdate() 
{ 
    handler.removeCallbacks(UpdateListUI); 
    handler.postDelayed(UpdateListUI, 1000); // 1 second 

} 

private Runnable UpdateListUI = new Runnable() { 
    public void run() { 
     //Remove Elements first 
     removeDeletedItemsFromList(); 

     //Update Adapter 
     mFileAdapter.notifyDataSetChanged(); 

     handler.postDelayed(this, 1500); // 1,5 seconds 
    } 
}; 

तो, इसे करने का सबसे अच्छा तरीका क्या है? शायद ऐसा करने का एक और तरीका भी है, लेकिन जिसमें से मैंने पहले सोचा नहीं है!

उत्तर

1

हैंडलर का उपयोग करने के बजाय आप Async कार्य का उपयोग करेंगे। हालांकि हैंडलर यहां काम करता है लेकिन यह जावा अवधारणा है और असिंक टास्क एंड्रॉइड है।

और आप का उपयोग करके सूची दृश्य को अपडेट कर सकते हैं: mFileAdapter.notifyDataSetChanged(); केवल यह सही है।

+0

कृपया मुझे ठीक कर लें मैं गलत हूँ, लेकिन देखने की मेरी बात से, Async कार्य जो शीघ्र ही चल रहा है और एक अद्यतन _during_ या _after_ कार्य समाप्त हो गया है की जरूरत है किसी कार्य के लिए जिम्मेदार है। – Webchen

0

Handler और Thread का उपयोग करने के बजाय आप AlarmManager का उपयोग कर सकते हैं। बस अलार्म को एक बार शुरू करें और यह बिना किसी थ्रेड या हैंडलर के अंतराल की परिभाषित अवधि के साथ आपकी सूची अपडेट करेगा। आपने एक सेवा बनाई थी और आप अलार्ममेनगर का उपयोग कर उस सेवा का संदर्भ दे सकते हैं।

AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(arg0, TestService.class); 
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0); 
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi); 

और में TestService आप अपनी सूची को अद्यतन करने के कोड हो सकता है।

संबंधित मुद्दे