2013-04-25 14 views
5

buduję aplikacji i otrzymuję NetworkOnMainThreadException INSIDE się AsyncTaskandroid.os.NetworkOnMainThreadException wewnątrz AsyncTask

Call:

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 

Jestem bardzo zdezorientowany, dlaczego ten wyjątek jest wrzucony do do w DoInBackground z AsyncTask, wszelkie pomysły?

Odpowiedz

7

Przenieś kod JSON do 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

Wszystko w "AsyncTask" znajduje się na głównym wątku UI z wyjątkiem 'doInBackground()'. Ogólną ideą jest obsługa typowych przypadków użycia, takich jak: skonfiguruj 'ProgressBar' w' onPreExecute() ', zaktualizuj' ProgressBar' w 'onProgressUpdate()', a na końcu odrzuć 'ProgressBar' w' onPostExecute () '. Wszystkie te funkcje są bezpieczne dla wątków UI, natomiast 'doInBackground()' może bezpiecznie zajmować tyle czasu, ile potrzebuje. –

2

result.getEntity().getContent() otwiera strumień, który odczytuje z sieci, dzięki czemu komunikacja sieciowa jest w głównym wątku. Przenieś parsowanie JSON do doInBackground() i wykonaj tylko zadania interfejsu użytkownika w onPostExecute().

+0

Wielkie dzięki! Tylko na przyszłość, "onPostExicute" znajduje się w głównym wątku? –

+0

to jest poprawne. również 'onPreExecute()'. Wszystko, co musisz wiedzieć, znajdziesz tutaj: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

Myślę, że problem występuje, ponieważ twoje są dziedziczenie MainActivity do swojej AsyncTask, spróbuj reomve tę część kodu:

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

Ponieważ nie jest to potrzebne, a jeśli chcesz przekazać żadnych argumentów do AsyncTask można go natychmiast przekazać za pomocą metody doInBackGround().

także, aby połączyć się AsyncTask użyć następujących new POST().execute();

Również nie trzeba zadzwonić super.onPostExecute(result); do swojego sposobu onPostExecute().

Mam nadzieję, że ta pomoc.