2013-12-09 12 views
6

मैं होने 2 कक्षाएं,अद्यतन सूचीदृश्य

1.Activity वर्ग

2.Service वर्ग

मैं अपने सूची दृश्य को अपडेट करने के लिए अपनी गतिविधियों में की जरूरत है, जब सेवा मिल गया कोई सुधार। दरअसल मैं चैट एप्लिकेशन की तरह कोशिश कर रहा हूं, मेरी सेवाएं हमेशा मेरी डीबी की जांच करती हैं और यदि उसे कोई नई स्ट्रिंग मिलती है, तो मुझे फिर से पुनर्निर्माण किए बिना अपनी गतिविधि में अपडेट करने की आवश्यकता होती है, मुझे केवल सूची दृश्य को ताज़ा करने की आवश्यकता होती है। मैंने पाया कि इसे आईबिंडर का उपयोग करके छेड़छाड़ की जाएगी, लेकिन मैं इसका उपयोग कैसे नहीं करता हूं। क्या कोई मुझे कोड के कुछ उदाहरणों के साथ सुझाव दे सकता है।

referred pages

उत्तर

4

आप एक बाउंड सेवा का उपयोग करना चाहिए। मैंने अपने आवेदन में कुछ ऐसा ही किया। रीफ्रेश पर क्लिक करने पर, मैं एक ऐसी सेवा का आह्वान करता हूं जो पृष्ठभूमि में डेटा प्राप्त करता है और यूआई अपडेट करता है।

चेक बाहर मेरी सेवा यहाँ: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override 
protected void onPostExecute(AnalyticsAccountResult result) { 
    super.onPostExecute(result); 
    App.getEventBus().post(result); 
} 

गतिविधि: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe 
public void UpdateUI(AnalyticsAccountResult result) { 
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress); 
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout); 
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage); 

    switch (result.getStatus()) { 
     case STARTING: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.VISIBLE); 
     spinnerLayout.setVisibility(View.GONE); 
     break; 

     case FAILURE: 
     statusMessage.setVisibility(View.VISIBLE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.GONE); 
     statusMessage.setText(result.getErrorMessage()); 
     break; 

     case SUCCESS: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.VISIBLE); 

     if (result.getItems() != null) 
     { 
      this.acProfiles = result.getItems(); 
      MyAdapter myAdapter = new MyAdapter(acProfiles, this); 
      listView.setAdapter(myAdapter); 
      UpdateSelectionPreferences(); 
      if (result.isPersist() && acProfiles.size() > 0) 
      { 
       if (App.LOCAL_LOGV) 
       Log.v(App.TAG, "saving configdata");   
       try 
       { 
        appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName()); 
       } 
       catch (JsonProcessingException e) 
       { 
        Log.e(App.TAG, e.getMessage()); 
       } 
      } 
     } 
     break; 
    } 
} 

यह भी ओटो लाइब्रेरी का उपयोग करने के लिए उपयोगी होगा:
http://square.github.io/otto/

0

अधिक जानकारी के बिना मैं कर सकते हैं कोई भी उपयोगी कोड उदाहरण प्रदान न करें, हालांकि मुझे लगता है कि आप जो खोज रहे हैं वह एक सूची एडाप्टर है। एक ListAdapter एक सूचीदृश्य और एक डेटासेट लेता है (आपके मामले में शायद तारों की एक सरणी) और 2 को जोड़ता है। जब भी डेटासेट बदलता है (आपके मामले में यह तब होगा जब आपकी सेवा एक नई स्ट्रिंग का पता लगाती है और इसे सरणी में जोड़ती है) आप बस कॉल ListAdapter.notifyDataSetChanged() और सूचीदृश्य स्वचालित रूप से आपकी नई जानकारी के साथ अपडेट हो जाएगा। विशिष्ट सूची एडाप्टर पर अधिक जानकारी के लिए http://developer.android.com/reference/android/widget/ArrayAdapter.html देखें, जिसका आप उपयोग कर सकते हैं।

+1

Thanx, .. असल में आप सही हैं। लेकिन मेरा सवाल यह है कि मुझे कैसे पता चलेगा कि मेरी गतिविधि से डेटासेट किया गया है .. मुझे अपनी सेवा से कैसे सूचित किया जाना चाहिए। – GaneshKumar

+0

मुझे इसे व्यक्तिगत रूप से नहीं करना है, इसलिए मैं यह सुनिश्चित नहीं कर सकता कि कौन सी विधि सबसे अच्छी है, लेकिन मुझे लगता है कि एक [ब्रॉडकास्ट रिसीवर] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) होगा आप के लिए काम करता हूं। यह एक अमूर्त वर्ग है जो किसी सेवा द्वारा प्रसारित संदेशों को संभाल सकता है। जब सेवा एक नई स्ट्रिंग पाती है तो सेवा इसकी प्रेषण ब्रॉडकास्ट() विधि का उपयोग करेगी और आपकी गतिविधि ब्रॉडकास्ट रिसीवर के रूप में पंजीकृत होगी जो प्रसारण प्राप्त होने पर कुछ क्रियाएं करेगी। – csmckelvey

3

मान लीजिए कि आपके पास मुख्य गतिविधि नामक गतिविधि वर्ग है जहां आपने अपनी सूची दृश्य को एडवेंटर नामसूची एडाप्टर के साथ आरंभ किया है। MainActivity अंदर इस कोड डालें:

public static Handler UIHandler; 

    static { 
     UIHandler = new Handler(Looper.getMainLooper()); 
    } 

    public static void runOnUI(Runnable runnable) { 
     UIHandler.post(runnable); 
    } 

जब आप अपनी सेवा वर्ग के अंदर अपने सूचीदृश्य डेटा में बदलाव किए, ListView के लिए नए डेटा लागू करना इस कोड को लिखें: आपके उत्तर के लिए

MainActivity.runOnUI(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      MainActivity.listviewAdapter.notifyDataSetChanged(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

यह अच्छा है, अभी के लिए काम कर रहा है, लेकिन कुछ थ्रेड संबंधित अपवादों के बाद मुझे डर है: / – Reda

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