5

मैं एक आवेदन का निर्माण कर रहा हूँ और एक NetworkOnMainThreadException अंदर एक AsyncTask हो रही है अंदरandroid.os.NetworkOnMainThreadException AsyncTask

कॉल:

new POST(this).execute(""); 

asyncTask:

public class POST extends AsyncTask<String, Integer, HttpResponse>{ 
private MainActivity form; 
public POST(MainActivity form){ 
    this.form = form; 
} 


@Override 
protected HttpResponse doInBackground(String... params) { 
try { 
     HttpPost httppost = new HttpPost("http://diarwe.com:8080/account/login"); 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
    nameValuePairs.add(new BasicNameValuePair("email",((EditText)form.findViewById(R.id.in_email)).getText().toString())); 
    //add more... 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    return new DefaultHttpClient().execute(httppost); 
} catch (Exception e) { 
    Log.e("BackgroundError", e.toString()); 
} 
return null; 
} 

@Override 
protected void onPostExecute(HttpResponse result) { 
super.onPostExecute(result); 
try { 
    Gson gSon = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); 
    gSon.fromJson(IOUtils.toString(result.getEntity().getContent()), LogonInfo.class).fill(form); 
} catch (Exception e) { 
    Log.e("BackgroundError", e.toString()); 
} 
} 
} 

LogCat:

BackgroundError | android.os.NetworkOnMainThreadException 

मैं बहुत उलझन में हूं कि इस अपवाद को एक AsyncTask के doInBackground में किए गए किसी भी विचार में क्यों फेंक दिया गया है?

उत्तर

7

doInBackground() में JSON कोड ले जाएँ:

@Override 
protected HttpResponse doInBackground(String... params) { 
    ... 
    Your current HttpPost code... 
    ... 
    Gson gSon = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); 
    gSon.fromJson(IOUtils.toString(result.getEntity().getContent()), LogonInfo.class).fill(form); 
    ... 
} 
+1

'AsyncTask' में सब कुछ' UIInBackground() 'को छोड़कर मुख्य यूआई थ्रेड पर है। सामान्य विचार निम्नलिखित उपयोगों जैसे सामान्य उपयोगों का समर्थन करना है: 'onPreExecute()' में अपना 'प्रोग्रेसबार' सेट अप करें, 'प्रगतिबार' को 'onProgressUpdate()' में अपडेट करें, और आखिर में'PostExecute 'में अपने' प्रोग्रेसबार 'को खारिज करें () '। उन सभी कार्यों में यूआई थ्रेड सुरक्षित है जबकि 'doInBackground()' सुरक्षित रूप से जितनी बार आवश्यकता हो उतनी समय ले सकता है। –

2

result.getEntity().getContent() एक धारा है कि नेटवर्क से पढ़ता खुलती है, ताकि नेटवर्क संचार मुख्य थ्रेड में है। JSON पार्सिंग को doInBackground() पर ले जाएं और केवल onPostExecute() में UI कार्य करें।

+0

धन्यवाद एक गुच्छा! भविष्य के संदर्भ के लिए, 'onPostExicute' मुख्य धागे पर है? –

+0

जो सही है। 'onPreExecute()' भी। आपको जो कुछ भी जानने की जरूरत है वह यहां मिल सकती है: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

मैं समस्या तब होती है के बाद से अपने अपने AsyncTask में MainActivity इनहेरिट कर रहे हैं, कोड के इस हिस्से reomve करने की कोशिश लगता है:

private MainActivity form; 
public POST(MainActivity form){ 
    this.form = form; 
} 

के बाद आप इसे की आवश्यकता नहीं है, और आप के लिए किसी भी तर्क पारित करने के लिए चाहते हैं, तो AsyncTask आप इसे तुरंत doInBackGround() विधि के माध्यम से पास कर सकते हैं।

भी कॉल करने के लिए अपने AsyncTask का उपयोग निम्नलिखित new POST().execute();

इसके अलावा, आप अपने onPostExecute() विधि में super.onPostExecute(result); कॉल करने के लिए की जरूरत नहीं है।

मुझे आशा है कि यह सहायता होगी।