5
내가 응용 프로그램을 짓고 있어요 내부 AsyncTask를을 NetworkOnMainThreadException 을 얻고있다

내부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()); 
} 
} 
} 

로그 캣 :

BackgroundError | android.os.NetworkOnMainThreadException 

나는이 예외가 왜 doInBackground의 AsyncTask에서 던져 졌는지 혼란 스럽다.

@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); 
    ... 
} 

답변

7
doInBackground()JSON 코드 이동

. JSON 구문 분석을 doInBackground()으로 이동하고 onPostExecute()의 UI 작업 만 수행하십시오.

+1

'AsyncTask'의 모든 것은'doInBackground()'를 제외하고 메인 UI 스레드에 있습니다. 일반적인 아이디어는 다음과 같은 일반적인 유즈 케이스를 지원하는 것입니다 : onPreExecute()에서'ProgressBar'를 설정하고,'onProgressUpdate()'에서'ProgressBar'를 업데이트하고, 마지막으로'ProgressBar'를'onPostExecute)'. 이 모든 함수는 UI 쓰레드에 안전하지만'doInBackground()'는 필요한만큼의 시간을 안전하게 가져갈 수 있습니다. –

2

result.getEntity().getContent() 네트워크로부터 판독하는 스트림을 연다 때문에 네트워크 통신 메인 쓰레드이다

+0

감사합니다. 나중에 참조 할 때,'onPostExicute'가 메인 스레드에 있습니까? –

+0

이 맞습니다. 'onPreExecute()'도 마찬가지다. 알아 두어야 할 모든 사항은 http://developer.android.com/reference/android/os/AsyncTask.html에서 확인할 수 있습니다. – SimonSays

0

나는 당신이 당신의 AsyncTaskMainActivity을 상속되기 때문에 문제가, 코드의이 부분을 reomve하려고 발생 생각 :

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

당신은 그것을 필요가없는 때문에, 당신은 어떤 인수를 전달하려면 AsyncTaskdoInBackGround() 메서드를 통해 전달할 수 있습니다.

또한 전화에 AsyncTask 다음 new POST().execute();

은 또한 당신이 당신의 onPostExecute() 방법에 super.onPostExecute(result);를 호출 할 필요가 없습니다 사용합니다.

이 도움이 되었기를 바랍니다.