5

Я строю приложение и я получаю NetworkOnMainThreadException ВНУТРИ в AsyncTaskandroid.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 

Я очень смущен, почему это исключение выбрано в doInBackground из AsyncTask, любые идеи?

ответ

7

Перемещение JSON код в 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

Все в 'AsyncTask' находится в главном потоке пользовательского интерфейса, за исключением' doInBackground() '. Общая идея состоит в том, чтобы поддерживать общие варианты использования, такие как следующее: Настройте свой 'ProgressBar' в' onPreExecute() ', обновите свой' ProgressBar' в 'onProgressUpdate()' и, наконец, отпустите свой 'ProgressBar' в' onPostExecute (onPostExecute)) '. Все эти функции являются безопасными потоками пользовательского интерфейса, в то время как 'doInBackground()' может безопасно брать столько времени, сколько нужно. –

2

result.getEntity().getContent() открывает поток, который считывает из сети, поэтому сеть связи в главном потоке. Переведите разбор JSON на doInBackground() и выполните только задачи пользовательского интерфейса в onPostExecute().

+0

Спасибо! Только для справок в будущем, 'onPostExicute' находится в основном потоке? –

+0

это правильно. 'onPreExecute()' тоже. Все, что вам нужно знать, можно найти здесь: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

Я думаю, что проблема возникает, так как Ваши, наследуя MainActivity в свой AsyncTask, попытайтесь reomve этой части кода:

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

Так что вам не нужно, и если вы хотите передать какие-либо аргументы в AsyncTask вы можете передать его непосредственно через метод doInBackGround().

Также вызвать ваш AsyncTask использовать следующие new POST().execute();

Также вам не нужно вызывать super.onPostExecute(result); в ваш метод onPostExecute().

Я надеюсь, что эта помощь.

 Смежные вопросы

  • Нет связанных вопросов^_^