2011-09-19 6 views
8

मैं AsyncTaks में स्पिनर सामग्री को संशोधित करने का प्रयास करता हूं लेकिन मैं नहीं कर सकता और लॉगकैट लिखा है "09-19 16: 36: 11.189: त्रुटि/त्रुटि (6078): केवल मूल धागा जिसने दृश्य पदानुक्रम बनाया है अपने विचारों को छूएं। "AsyncTask "केवल दृश्य धागा जिसने दृश्य पदानुक्रम बनाया है, उसके विचारों को छू सकता है।"

public class GetGroups extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     Spinner combo = (Spinner) findViewById(R.id.group_combo); 

     setGroups(combo); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void unused) 
    { 
     super.onPostExecute(unused); 


     Spinner combo = (Spinner) findViewById(R.id.severity_combo); 

     combo.setSelection(1); 

     //updateGroups(); 
     //if (!isFinishing()) 
     //{ 
      /*Spinner combo = (Spinner) findViewById(R.id.group_combo); 
      ProgressBar pg = (ProgressBar) findViewById(R.id.loading_group); 

      pg.setVisibility(ProgressBar.GONE); 
      combo.setVisibility(Spinner.VISIBLE); 

      combo.setSelection(0);*/ 
     //} 
    } 
} 
} 

और समारोह setGroups है:

public void setGroups(Spinner combo) { 

    try { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     HttpPost httpPost = new HttpPost(this.object.url); 

     List<NameValuePair> parameters = new ArrayList<NameValuePair>(2); 
     parameters.add(new BasicNameValuePair("user", this.object.user)); 
     parameters.add(new BasicNameValuePair("pass", this.object.password)); 
     parameters.add(new BasicNameValuePair("op", "get")); 
     parameters.add(new BasicNameValuePair("op2", "groups")); 
     parameters.add(new BasicNameValuePair("other_mode", "url_encode_separator_|")); 
     parameters.add(new BasicNameValuePair("return_type", "csv")); 
     parameters.add(new BasicNameValuePair("other", ";")); 

     UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters); 

     httpPost.setEntity(entity); 

     HttpResponse response = httpClient.execute(httpPost); 
     HttpEntity entityResponse = response.getEntity(); 

     String return_api = this.object.convertStreamToString(entityResponse.getContent()); 

     String[] lines = return_api.split("\n"); 

     ArrayList<String> array = new ArrayList<String>(); 

     for (int i= 0; i < lines.length; i++) { 
      String[] groups = lines[i].split(";", 21); 

      this.pandoraGroups.put(new Integer(groups[0]), groups[1]); 

      array.add(groups[1]); 
     } 

     ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, 
      array); 
     combo.setAdapter(spinnerArrayAdapter); 
    } 
    catch (Exception e) { 
     Log.e("ERROR THE ", e.getMessage()); 

     return; 
    } 
} 

क्या गलत है? धन्यवाद।

+0

GetGroups एक आंतरिक वर्ग है में से एक के आधार पर? –

+1

आप क्या करने की कोशिश कर रहे हैं? [केवल मूल बात यह है कि एक दृश्य पदानुक्रम बनाया अपने विचार छू सकता है] (की – Ronnie

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/10497854/only-the-original-thread-that-created-a-view-hierarchy- कैन-टच-इसके-दृश्य) –

उत्तर

10

आप doInBackground() विधि के अंदर अपने मामले में पृष्ठभूमि थ्रेड से यूआई घटकों (देखें) तक पहुंचने का प्रयास कर रहे हैं। आप not allowed to do that हैं।

24

जैसा कि पीटर ने उल्लेख किया है, आप doInBackground() का उपयोग करके विचारों तक नहीं पहुंच सकते हैं। हालांकि आप onPostExecute() के अंदर ऐसा कर सकते हैं। जहां तक ​​मुझे पता है कि doInBackground() परिणाम के साथ आपको काम करना चाहिए।

मैं इस मुद्दे में भाग गया और दृश्य संशोधन कोड onPostExecute() पर ले जाकर इसे ठीक कर दिया।

आप में से जो लोग Android विकास को लेने के लिए शुरू कर रहे हैं के लिए:
- doInBackground(): जो कुछ भी अंदर एक और धागा में होती हैं (पृष्ठभूमि में) विभिन्न मुख्य/मूल धागा अपने विचार/टुकड़ा/गतिविधि पर चल रही है से (इस AsyncTask == के पूरे मुद्दे> आप विचारों स्पर्श है नहीं कर सकते
- onPostExecute(): अब पृष्ठभूमि सामान किया जाता है, यहाँ यह मुख्य/धागा धागे पर वापस आ गया है ==> आप विचारों अब छू सकता है

3

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

तो, आप अपने AsyncTask में onProgressUpdate ओवरराइड और यह सुनिश्चित करें कि दूसरी वस्तु एक शून्य लेकिन एक पूर्णांक या एक स्ट्रिंग है कि onProgressUpdate द्वारा पढ़ा जाता है नहीं है होना है।उदाहरण के लिए स्ट्रिंग का उपयोग कर:

@Override 
protected Boolean doInBackground(Void... params) { 
    your code... 
    publishProgress("My % status..."); 
    your code... 
    publishProgress("Done!"); 
} 

सामान्य रूप में अधिक है, जब आप एक AsyncTask घोषित आप के लिए है:

public class MyAsyncTask extends AsyncTask<Void, String, Void> { 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     if (values != null && values.length > 0) { 
      //Your View attribute object in the activity 
      // already initialized in the onCreate! 
      mStatusMessageView.setText(values[0]); 
     } 
    } 
} 

पृष्ठभूमि विधि आप publishProgress(value as String) फोन जो स्वत: onProgressUpdate विधि है जो मुख्य यूआई धागा का उपयोग कॉल की तुलना में

  • 01: <Params, Progress, Result> कक्षाएं कि मुख्य तरीके को पास किया जाता निर्दिष्ट करते हैं, इन अपनी खुद की कक्षाओं या सिर्फ जावा वर्गों हो सकता है
  • onProgressUpdate(Progress... value)
  • onPostExecute(Result... success)
+0

मैंने ऑन प्रोग्रेसअपडेट पर अमान्य कहा और यह कोई त्रुटि के साथ काम करता है। –

3

एक छोटी सी अधिक जानकारी के

समस्या:

  • UI तत्व केवल यूआई सूत्र में संशोधित किया जा सकता। एक अपवाद उनके postInvalidate() विधि (और इसके रूपों) को यूआई थ्रेड
  • के बाहर से निष्पादित किया जा सकता है, जो यूआई थ्रेड के बाहर से यूआई तत्व (View) को संशोधित करने के प्रयास के कारण होता है - doInBackground() रन एक पृष्ठभूमि धागा

समाधान:

  • onPostExecute() विधि में विचारों को संशोधित - यह यूआई धागा पर चलता है
  • प्राप्त एक Activity और के लिए एक संदर्भ इसकी runOnUiThread(Runnable) विधि
  • का उपयोग संशोधन उपयोग View के post...() तरीकों
संबंधित मुद्दे

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