2013-04-25 25 views
5

Tôi đang xây dựng một ứng dụng và nhận được một NetworkOnMainThreadException INSIDE một AsyncTaskandroid.os.NetworkOnMainThreadException bên AsyncTask

Gọi:

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 

Tôi rất bối rối vì sao ngoại lệ này được ném vào trong doInBackground của AsyncTask, bất kỳ ý tưởng nào?

Trả lời

7

Di chuyển mã JSON vào 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

Mọi thứ trong 'AsyncTask' đều nằm trong Giao diện người dùng chính ngoại trừ 'doInBackground()'. Ý tưởng chung là hỗ trợ các trường hợp sử dụng phổ biến như sau: Thiết lập 'ProgressBar' của bạn trong' onPreExecute() ', cập nhật' ProgressBar' của bạn trong 'onProgressUpdate()', và cuối cùng loại bỏ 'ProgressBar' của bạn trong' onPostExecute () '. Tất cả các chức năng này là UI Thread an toàn trong khi 'doInBackground()' có thể mất nhiều thời gian khi cần. –

2

result.getEntity().getContent() mở ra một dòng mà đọc từ mạng, do đó giao tiếp mạng IS trong các chủ đề chính. Di chuyển phân tích cú pháp JSON sang doInBackground() và chỉ thực hiện các tác vụ giao diện người dùng trong onPostExecute().

+0

Cảm ơn bạn! Chỉ để tham khảo trong tương lai, 'onPostExicute' là chủ đề chính? –

+0

đúng. 'onPreExecute()' cũng vậy. Mọi thứ bạn cần biết có thể tìm thấy tại đây: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

Tôi nghĩ vấn đề xảy ra kể từ khi bạn được kế thừa những MainActivity vào AsyncTask của bạn, hãy cố gắng reomve phần mã này:

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

Kể từ khi bạn không cần đến nó, và nếu bạn muốn vượt qua bất kỳ đối số đến AsyncTask bạn có thể chuyển nó qua phương thức doInBackGround() ngay lập tức.

Cũng gọi của bạn AsyncTask sử dụng sau đây new POST().execute();

Ngoài ra bạn không cần phải gọi super.onPostExecute(result); vào phương pháp onPostExecute() của bạn.

Tôi hy vọng sự trợ giúp này.

Các vấn đề liên quan