2013-02-21 21 views
6

मैं एंड्रॉइड के लिए नोब हूं और मुझे एक एपविजेट अपडेट करने में समस्याएं आ रही हैं। यह एक समाचार विजेट है जो प्रत्येक 20 सेकंड में अलग-अलग पाठ प्रदर्शित करता है। जब विजेट प्रारंभ होता है तो मुझे & को ठीक से प्रदर्शित करने के लिए पाठ प्राप्त करने में कोई समस्या नहीं है। हालांकि, विजेट के हर 30 मिनट के अपडेट के बाद मेरी widgetID int सरणी उस int को बरकरार रखती है जो अद्यतन से पहले मौजूद थी। तो प्रत्येक अद्यतन के बाद विजेट पुराने डेटा और नए डेटा दिखाता है। अद्यतन प्रक्रिया के दौरान पुराने डेटा की विजेट आईडी int सरणी को साफ़ करने के लिए कोई है। कोई भी मदद बहुत ही सराहनीय होगी।मैं ऐपविड्ज को उचित रूप से अपडेट कैसे करूं?

मेरे कोड: विजेट में पाठ स्विच करने के लिए

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

विधि। यह शुरू में ठीक काम करता है, लेकिन अद्यतन के बाद नए डेटा के साथ पुराने डेटा से पता चलता ...

public void updateStory() { 

    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 
    appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 

संपादित

public void updateStory() { 
    //Added 
    appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 
    ComponentName thisWidget = new ComponentName(getApplicationContext(),MyWidgetProvider.class); 
    remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget1);  


    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 



    appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

    //appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 
+0

शायद अगर आप और {StoryCounter ++ सेट करते हैं; } कहानी के लिए = 0; चाल करेगा। – k0sh

+0

जवाब देने के लिए धन्यवाद। यह पिछले विजेटिड के डेटा को प्रदर्शित होने से कैसे रोक देगा? –

+0

मैंने पहले कभी विगेट्स के साथ काम नहीं किया लेकिन मैं बिटमैप्स के साथ बहुत काम करता हूं। और जब मैं कुछ बिटमैप को रीसेट करना चाहता हूं तो मैं bmp = null को कॉल करूंगा; मुझे यकीन नहीं है कि आप वहां क्या करने की कोशिश कर रहे हैं। लेकिन आप कहानी काउंटर ++ को बुला रहे हैं; जब कहानी काउंटर = 0; और आपके अन्य कथन में। जिसका मतलब है कि आपने अपनी कहानी को मंजूरी दे दी है काउंटर = 0; और फिर आपने कहानी काउंटर ++ कहा; तुम ऐसा क्यों करोगे ? तर्कसंगत रूप से आपके अगर किसी अन्य कथन में आपको अलग-अलग चीजें करना है लेकिन आप में आप दो बार एक ही काम कर रहे हैं। – k0sh

उत्तर

1

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

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

// You need to provide: 
// myContext - the Context it is being run in. 
// R.layout.widget - the xml layout of the widget 
// All the content to put in it (duh!) 
// Widget.class - the class for the widget 

RemoteViews rv= new RemoteViews(myContext.getPackageName(), R.layout.widget); 
rv.setXXXXXXX // as per normal using most recent data set. 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(myContext); 
// If you know the App Widget Id use this: 
appWidgetManager.updateAppWidget(appWidgetId, rv); 
// Or to update all your widgets with the same contents: 
ComponentName projectWidget = new ComponentName(myContext, Widget.class); 
appWidgetManager.updateAppWidget(projectWidget, rv); 

अक्सर तरीका सबसे आसान (मेरे विचार में) एक WidgetUpdater.class जो आप या तो एक सेवा से कॉल करते हैं या सीधे एक समय अलार्म कॉल उसका उपयोग करके इस लपेट के लिए है। ऑनअपडेट का उपयोग करना आम तौर पर एक बुरा विचार है क्योंकि यह फोन को पूर्ण पावर मोड में मजबूर करता है और यह बहुत ही नियंत्रित नहीं होता है। मैंने इसे कभी भी काम करने में कामयाब नहीं रहा है। कुछ ऐसा करने के लिए बेहतर है:

Intent myIntent = // As per your onUpdate Code 
    alarmPendingIntent = PendingIntent.getService(context, 0, myIntent, PendingIntent.FLAG_ONE_SHOT); 

    // ... using the alarm manager mechanism. 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTimeMillis, alarmPendingIntent); 
+0

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

+0

मैंने जवाब देने का विस्तार किया है और स्पष्ट किया है कि मैं एक अलग दृष्टिकोण का प्रस्ताव क्यों दे रहा हूं - यदि यह अभी भी स्पष्ट नहीं है तो कृपया कहें। –

+0

क्या आपने इसे अभी हल किया है? –

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