2011-12-22 12 views
8

स्थिति के बाद:विजेट अपडेट करने के लिए AsyncTask --PostExecute() में टेक्स्टव्यू तक कैसे पहुंचे?

मैं एक app widget जो एक यूआरएल से चुनाव डेटा और parsed html साथ विजेट अद्यतन करता है। pre-honeycomb डिवाइस पर यह एक अलग थ्रेड का उपयोग किये बिना service के माध्यम से किया जा सकता है। अब, आईसीएस पर, यह बदल गया है और ASyncThread आवश्यक है।

Widget-Updater-Service में TextViews उपयोग करने के लिए मैं

RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_layout); 
remoteViews.setTextViewText(R.id.TextView1,"test"); 

का उपयोग लेकिन यह एक ASyncThread में काम नहीं लगता है। क्या यह हो सकता है कि जब थ्रेड textview को बदलने की कोशिश कर रहा है तो मुख्य सेवा को पहले से ही समाप्त कर दिया गया है?

इस समस्या को हल करने के लिए कोई विचार?

+0

ध्यान दें कि आप [StrictMode.ThreadPolicy] का उपयोग कर सकते (http://developer.android.com/reference/android/ ओएस/StrictMode.ThreadPolicy.html) यूआई थ्रेड पर नेटवर्क ऑपरेशन चलाने की अनुमति रखने के लिए एंड्रॉइड 3.0+ पर डिफ़ॉल्ट व्यवहार को बदलें। – yorkw

+0

क्या आप कुछ और कोड प्रदान कर सकते हैं? मैं कुछ ऐसा करने के लिए AsyncTask का उपयोग कर रहा हूं और मदद करने में सक्षम हो सकता हूं। –

+0

मैं सीधे एक नया उपयोगकर्ता हूं क्योंकि मैं सीधे टिप्पणी नहीं कर सकता, लेकिन मैंने इसे पेस्टबिन पर रखा: http://pastebin.com/HQYaJBAm – skyworxx

उत्तर

-1

अपने अनुप्रयोग विजेट अद्यतन करने के लिए onpostexecute में .setText विधि()

+1

कोई "findvaluebyid" -method नहीं है, इसलिए मैं विजेट को अद्यतन करने के लिए setText का उपयोग नहीं कर सकता – skyworxx

-1

उपयोग निम्न विधि बुला की कोशिश कर रहा:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

समस्या "रिमोट व्यूज़" है, मैं इसे एसिंक्श्रेड – skyworxx

0

मेरी राय में, विजेट केवल डेटा है कि पहले से ही संसाधित किया जाता है लेने की जानी चाहिए और तुरंत उपलब्ध है। शायद आपको इस डेटा को तैयार करने के लिए एक सेवा कॉल करनी चाहिए (AsyncTask के माध्यम से) और जब सभी काम किया जाता है, तो सेवा appWidgetManager.updateAppWidget पर कॉल करनी चाहिए। लेकिन यह सिर्फ एमएचओ है।

3

प्रत्येक appWidgetId के लिए रिमोट व्यू का अपना रिकॉर्ड रखने के लिए सर्वश्रेष्ठ ताकि आपके निजी आंतरिक ब्रॉडकास्ट रिसीवर अपडेट कर सकें। आप AppWidgetManager.updateAppWidget() को समय पर केवल ACTION_UPDATE इरादे प्राप्त करने पर ही उपयोग कर सकते हैं।

Widget.java:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    RemoteViews remoteViews; 
    ComponentName watchWidget; 

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
    watchWidget = new ComponentName(context, Widget.class); 

    // onUpdate is called every xx seconds. 
    // trigger fetch from the server! 
    FetchTask fetchTask = new FetchTask(); 
    fetchTask.appWidgetManager = appWidgetManager; 
    fetchTask.remoteViews = remoteViews; 
    fetchTask.watchWidget = watchWidget; 

    fetchTask.execute(PHONE_NUMBERSURL); 
} 

FetchTask.java:

class FetchTask extends AsyncTask<String, Integer, List<String>> { 

    protected List<String> doInBackground(String... urls) { 
     List<String> Sent = new ArrayList<String>(); 
     return Sent; 
    } 

    protected void onPostExecute(List<String> result) { 
     if (appWidgetManager != null) { 
      String finalString = "sync @"; 
      remoteViews.setTextViewText(R.id.sync_textView, finalString); 
      appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
     } 
    } 

} 
+0

से एक्सेस नहीं कर सकता इसके लिए आपकी विधि: http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date लेकिन मुझे एक एफसी मिल रहा है। – Si8

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