2013-04-25 12 views
5

Sto costruendo un'applicazione e sto ottenendo un NetworkOnMainThreadException ALL'INTERNO un AsyncTaskandroid.os.NetworkOnMainThreadException all'interno AsyncTask

chiamata:

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 

Sono molto confuso perché questa eccezione viene lanciata nel DoInBackground di un AsyncTask, qualche idea?

risposta

7

spostare il codice JSON in doInBackground():

@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

Tutto in 'AsyncTask' si trova sul thread principale dell'interfaccia utente tranne per' doInBackground() '. L'idea generale è di supportare casi d'uso comuni come i seguenti: Configura il tuo 'ProgressBar' in 'onPreExecute()', aggiorna il tuo' ProgressBar' in 'onProgressUpdate()', e infine elimina il tuo 'ProgressBar' in 'onPostExecute () '. Tutte queste funzioni sono thread UI sicuro mentre 'doInBackground()' può tranquillamente impiegare tutto il tempo necessario. –

2

result.getEntity().getContent() apre un flusso che legge dalla rete, in modo che la comunicazione di rete è nel thread principale. Spostare l'analisi JSON su doInBackground() e svolgere solo le attività dell'interfaccia utente in onPostExecute().

+0

Grazie mille! Solo per riferimento futuro, 'onPostExicute' è sul thread principale? –

+0

corretto. anche 'onPreExecute()'. Tutto ciò che devi sapere può essere trovato qui: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

Credo che il problema si verifica poiché la vostra ereditano la MainActivity nel vostro AsyncTask, cercare di reomve questa parte di codice:

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

Dal momento che non avete bisogno, e se si vuole passare alcun argomento al AsyncTask è possibile passare immediatamente attraverso il metodo doInBackGround().

anche per chiamare la AsyncTask utilizzare la seguente new POST().execute();

Inoltre non c'è bisogno di chiamare super.onPostExecute(result); nel vostro metodo di onPostExecute().

Spero che questo aiuto.