2011-02-12 36 views
5

मैं एंड्रॉइड विकास के लिए नया हूं और मैं एक छोटा ऐप कोड करने की कोशिश कर रहा हूं जो मुझे बाहरी JSON फ़ाइल को पकड़ने और इसे पार्स करने की अनुमति देता है। मुझे यह काम करने के लिए मिला, हालांकि अगर मैं पृष्ठभूमि में इसे AsyncTask के रूप में निष्पादित करने का प्रयास करता हूं तो यह काम नहीं करेगा। (विधि findViewById (int) अपरिभाषित

TextView txtView1 = (TextView) findViewById R.id: ग्रहण मुझे त्रुटि

विधि findViewById (int) प्रकार LongOperation

इस पंक्ति में

के लिए अपरिभाषित है देता है .TextView01);

public class Main extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     new LongOperation().execute(); 
    } 
} 


class LongOperation extends AsyncTask<String, Void, String> { 
    private final Context LongOperation = null; 


    @Override 
    protected String doInBackground(String... params) { 
     try { 
      URL json = new URL("http://www.corps-marchia.de/jsontest.php"); 
      URLConnection tc = json.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream())); 

      String line; 
      while ((line = in.readLine()) != null) { 
        JSONArray ja = new JSONArray(line); 
        JSONObject jo = (JSONObject) ja.get(0); 
        TextView txtView1 = (TextView)findViewById(R.id.TextView01); 
        txtView1.setText(jo.getString("text") + " - " + jo.getString("secondtest")); 
      } 
     } catch (MalformedURLException e) { 
      Toast.makeText(this.LongOperation, "Malformed URL Exception: " + e, Toast.LENGTH_LONG).show(); 
     } catch (IOException e) { 
      Toast.makeText(this.LongOperation, "IO Exception: " + e, Toast.LENGTH_LONG).show(); 
     } catch (JSONException e) { 
      Toast.makeText(this.LongOperation, "JSON Exception: " + e, Toast.LENGTH_LONG).show(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     ProgressDialog pd = new ProgressDialog(LongOperation); 
     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pd.setMessage("Working..."); 
     pd.setIndeterminate(true); 
     pd.setCancelable(false); 
    }  

} 

इसे ठीक करने पर कोई भी विचार:

यहाँ मेरी कोड है?

उत्तर

3

अन्य उत्तर में से एक में AsyncTask के कार्यान्वयन त्रुटिपूर्ण है। प्रगति संवाद हर बार publishProgress के भीतर बनाया जा रहा है, और संवाद के संदर्भ विधि के बाहर दिखाई नहीं दे रहा है। है अत्यधिक खतरनाक अगर तुम नहीं जानते कि तुम क्या कर रहे हैं के रूप में आप पूरे गतिविधि लीक खत्म हो सकता है

public class Main extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     new LongOperation().execute(); 
    } 
    class LongOperation extends AsyncTask<String, Void, String> { 
     ProgressDialog pd = null; 
     TextView tv = null; 

     @Override 
     protected void onPreExecute(){ 
      tv = Main.this.findViewById(R.id.textvewid); 
      pd = new ProgressDialog(Main.this); 
      pd.setMessage("Working..."); 
      // setup rest of progress dialog 
     } 
     @Override 
     protected String doInBackground(String... params) { 
      //perform existing background task 
      return result; 
     } 
     @Override 
     protected void onPostExecute(String result){ 
      pd.dismiss(); 
      tv.setText(result); 
     } 
    } 
} 
+0

हे, उत्तर के लिए धन्यवाद। ive ने कोशिश की और मुझे यह त्रुटि दे रही है कि 53 और 54 की पंक्तियों में "मुख्य प्रकार का कोई मुख्य उदाहरण दायरे में उपलब्ध नहीं है"। यहां क्रमांकित पंक्तियों वाला स्रोत है: http://paste2.org/p/1244101 धन्यवाद अग्रिम – robs

+0

आह, आपने इसे एक ही जावा फ़ाइल में बनाया है, बस एक ही जावा फ़ाइल में। मेरे उदाहरण में 'लांगऑपरेशन' एक * सदस्य * वर्ग है, और इसलिए उस उदाहरण तक पहुंच है जो इसे संलग्न करती है। आपके कोड में 'लॉन्गऑपरेशन' एक शीर्ष-स्तरीय वर्ग है, इसलिए 'Main.this' गुंजाइश से बाहर है। समस्या को ठीक करने के लिए, आप या तो 'LongOperation' को स्थानांतरित कर सकते हैं ताकि यह सदस्य वर्ग हो या' LongOperation' के लिए एक कन्स्ट्रक्टर बनाएं जो 'संदर्भ' स्वीकार करता हो। फिर आप कार्य को लात मारने के लिए 'नया LongOperation (this) .execute();' का उपयोग करेंगे। –

+0

यह पूरी तरह से धन्यवाद काम किया! – robs

2

findViewById गतिविधि वर्ग में विधि है। जब आप इसे बनाते हैं तो आपको अपनी गतिविधि का उदाहरण अपने लॉन्गऑपरेशन में पास करना चाहिए। फिर findViewById को कॉल करने के लिए उस उदाहरण का उपयोग करें।

+2

कहीं अपने 'Activity' वर्ग का एक उदाहरण पासिंग: यहाँ मेरी प्रयास है! –

3

आप ऐसा कुछ करने की कोशिश कर रहे हैं जो काम नहीं करेगा। सबसे पहले आप एक कक्षा के अंदर हैं जो AsyncTask बढ़ाता है, इसलिए आपके पास यह विधि उपलब्ध नहीं होगी क्योंकि यह कक्षा Activity वर्ग की विधि है।

दूसरी समस्या यह है कि आप यूआई थ्रेड के साथ सिंक्रनाइज़ नहीं होने वाली विधि में यूआई सामान करने की कोशिश कर रहे हैं। ऐसा कुछ भी नहीं है जिसे आप करना चाहते हैं।

प्रक्रिया doInBackground विधि में अपने JSON उत्तर और onPostExecute पद्धति जहां आप यूआई सामान को संभालने में सक्षम के रूप में यह यूआई धागा से समन्वयित है हो जाएगा करने के लिए परिणाम गुजरती हैं।

आपके द्वारा वर्तमान सेटअप आपके द्वारा किए जाने वाले कार्यों को संभालने में आसान बना देगा। आप अपने LongOperation कक्षा को अपने Activity कक्षा का एक निजी वर्ग बना सकते हैं और उदाहरण सदस्य के रूप में TextView परिभाषित कर सकते हैं। अपने OnCreate के अंदर findViewById का उपयोग कर लेआउट को बंद करें और अपने AsyncTask की onPostExecute विधि के अंदर संशोधित करें (टेक्स्ट या जो कुछ भी सेट करें)।

मुझे उम्मीद है कि यह कुछ हद तक स्पष्ट है जिसका मेरा मतलब था।

+0

आईव ने "TextView txtView1 = (TextView) findViewById (R.id.TextView01) डालने का प्रयास किया;" onPostExecute विधि में लेकिन मुझे अभी भी एक ही त्रुटि मिल रही है। क्या आपका मतलब यही है? क्या आप मुझे अपना मतलब बता सकते हैं? अग्रिम धन्यवाद – robs

5

यह वही है जो आपको इसे काम करने के लिए करना चाहिए। का प्रयोग करें onPostExecude()

public class Main extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     new LongOperation(this).execute(); 
    } 
} 


class LongOperation extends AsyncTask<String, Void, String> { 
    private Main longOperationContext = null; 

    public LongOperation(Main context) { 
     longOperationContext = context; 
     Log.v("LongOper", "Konstuktor"); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     Log.v("doInBackground", "inside"); 
     StringBuilder sb = new StringBuilder(); 

     try { 
      URL json = new URL("http://www.corps-marchia.de/jsontest.php"); 
      URLConnection tc = json.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream())); 

      String line; 
      while ((line = in.readLine()) != null) { 
        JSONArray ja = new JSONArray(line); 
        JSONObject jo = (JSONObject) ja.get(0); 
        Log.v("line = ", "jo.getString() ="+jo.getString("text")); 
        sb.append(jo.getString("text") + " - " + jo.getString("secondtest")).append("\n"); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      Log.v("Error", "URL exc"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.v("ERROR", "IOEXECPTOIn"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      Log.v("Error", "JsonException"); 
     } 
     String result = sb.toString(); 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.v("onPostExe", "result = "+result); 
     TextView txtView1 = (TextView)longOperationContext.findViewById(R.id.textView01); 
     txtView1.setText(result); 


    } 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     ProgressDialog pd = new ProgressDialog(longOperationContext); 
     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pd.setMessage("Working..."); 
     pd.setIndeterminate(true); 
     pd.setCancelable(false); 
    }  

} 
+0

धन्यवाद! यह लगभग यह किया था! हालांकि मैं प्रगतिशील काम ठीक से काम नहीं कर सकता।मैंने इसे PreExecute पर ले जाया और यह दिखाया गया, लेकिन ऐसा लगता है कि इसे हटाने में सक्षम नहीं है। ive ने post.hxecute() में pd.hide() को आजमाया लेकिन यह कहता है "पीडी हल नहीं किया जा सकता"। कोड का पालन करता है: [लिंक] (http://paste2.org/p/1243854) अग्रिम में धन्यवाद – robs

+0

कन्स्ट्रक्टर में पीडी इनिट बनाएं, और pd.show onPreExecute() में और इसेPostExecute() में हटा दें। और pd.hideiss() के बजाय pd.dismiss() का उपयोग करने का प्रयास करें। यह बेहतर है। यहां आपके पास कोड है -> http://paste2.org/p/1244908 – Bandzio

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