2013-04-25 13 views
5
Ben bir uygulama inşa ediyorum ve İÇERİ bir AsyncTask bir NetworkOnMainThreadException alıyorum

android.os.NetworkOnMainThreadException AsyncTask

Çağrı:

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 

Bu istisnanın bir AsyncTask'ın doInBackground'unda neden atıldığı konusunda kafam çok mu karıştı?

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

cevap

7
doInBackground() içine JSON kodunu taşıyın

. JSON ayrıştırma işlemini doInBackground()'a taşıyın ve yalnızca onPostExecute()'daki UI görevlerini yapın.

+1

'AsyncTask' içindeki her şey, doInBackground()' dışındaki ana UI Thread üzerindedir. Genel fikir, aşağıdaki gibi yaygın kullanım durumlarını desteklemektir: 'OnPreExecute()' içindeki 'ProgressBar'ınızı kurun, onProgressUpdate()' daki 'ProgressBar'ınızı güncelleyin ve nihayet onPostExecute içinde' ProgressBar'ınızı kapatın.) '. Tüm bu işlevler Kullanıcı Arabirimi Güvenlidir; 'doInBackground() ', ihtiyaç duyduğu kadar güvenli bir şekilde zaman alabilir. –

2

result.getEntity().getContent() ağdan okuyan bir akım açar, bu nedenle ağ iletişimi ana iş parçacığı IS:

+0

Teşekkürler bir demet! Sadece gelecek referans için, 'onPostExicute' ana iş parçacığı üzerinde mi? –

+0

doğrudur. 'onPreExecute()' da. Bilmeniz gereken her şey burada bulunabilir: http://developer.android.com/reference/android/os/AsyncTask.html – SimonSays

0

Ben senin senin AsyncTask içine MainActivity devralan beri sorun, bu kod parçasını reomve deneyin oluşur düşünüyorum:

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

İhtiyacınız yok olduğundan, ve herhangi bir argüman geçirmek istiyorsanız AsyncTask, doInBackGround() yöntemiyle anlık olarak iletebilirsiniz.

Ayrıca çağırmak için sizin AsyncTask aşağıdaki new POST().execute();

Ayrıca size onPostExecute() yöntem haline super.onPostExecute(result); aramak gerekmez kullanın.

Umarım bu yardım.