2014-09-19 2 views
2

Я пытаюсь создать мое первое приложение для Android, он использует AsyncTask для выполнения запроса на отправку. (для входа на сайт).Ошибка сети в основной теме при использовании AsyncTask

Я получил приложение, работающее отлично с отключенным StrictMode, но я бы хотел, чтобы он был безошибочным при исполнении в StrictMode. Eventhough я переработан мое приложение с помощью AsyncTask он все еще дает мне эту ошибку:

android.os.NetworkOnMainThreadException 
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 

Из того, что я прочитал в Интернете, используя AsyncTask должен решить это. Я не хочу использовать Java Threads, потому что хочу научиться делать это правильно.

Я строю новый класс, чтобы выполнить задачу, это называется MyAsyncTask, здесь де код класса

<code> 
package com.am.tuto; 
import android.os.AsyncTask;// removed rest of imports for readability 
public class MyAsyncTask extends AsyncTask<Void, Void, String> { 
String u; 
String p; 

public MyAsyncTask(String u, String p) 
{ 
    this.u=u; 
    this.p=p; 
} 

@Override protected String doInBackground(Void... params) { 
String msg=""; 
if ((u.length()>0)&&(p.length()>0)) 
{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://irrationalgamers.com/test.php"); 
try 
{ 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("username", u)); 
    nameValuePairs.add(new BasicNameValuePair("password", p)); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse response =httpclient.execute(httppost); // <----the error occurs 
    HttpEntity entity = response.getEntity(); 
    String responseString = EntityUtils.toString(entity, "UTF-8"); 
    System.out.println(responseString); 
    msg="success"; 
    msg=responseString; 
} 

catch (ClientProtocolException e) 
{ 
// TODO Auto-generated catch block 
} 
catch (IOException e) 
{ 
// TODO Auto-generated catch block 
} 
} 
else 
{ 
    msg="failed"; 
} 
return msg; 
} 

@Override protected void onPostExecute(String result) 
{ 
    MyBus.getInstance().post(new AsyncTaskResultEvent(doInBackground())); 
} 
} 
</code> 

Я имею в виду, что это может быть потому, что я создал свой собственный конструктор, но я чувствую, что я на самом деле есть передать некоторые параметры.

Я могу продолжить программирование приложения, но было бы неплохо узнать, как предотвратить эту проблему в будущем. Каждая статья я прочитал на ошибки указывает мне AsyncTask, что трудно найти решение, когда уже реализовано ...

Любые мысли по этому вопросу будет весьма aprreciated

+0

, как вы начинаете 'AsyncTask'? –

+0

Как вы запускаете AsyncTask? С get или execute? – Blackbelt

+0

@blackbelt Я запускаю его с выполнением –

ответ

2

В основном, ρяσѕρєя K ответил на ваш вопрос. Дополнительные сведения: вы никогда не должны звонить по телефону doInBackground. Весь смысл AsyncTask заключается в том, что он управляет передачей работы потоку рабочего фона и возвращает результаты в поток пользовательского интерфейса. То, что doInBackground возвращает то, что onPostExecute получает в качестве параметра.

Ваш onPostExecute должен выглядеть следующим образом:

@Override 
protected void onPostExecute(String result) { 
    MyBus.getInstance().post(new AsyncTaskResultEvent(result)); 
} 
+0

Благодарим вас за ввод, я не могу проверить свой код за выходные, но я думаю, на мой вопрос ответили. Хотя я до сих пор не понимаю, когда вызывается метод doInBackground(), я буду принимать ответ, поскольку он отвечает на вопрос, который я поставил :) Выполняется ли он при создании объекта? –

+0

'' 'AsyncTask''' сделает это за вас, вам не нужно вызывать его явно. Итак, что вы делаете достаточно: '' 'new MyAsyncTask (имя пользователя, пароль) .execute()' '' – bolot

+0

& ρяσѕρєя K Спасибо, что объяснили это хорошо, вместо того, чтобы просто копировать/вставлять решение, я знаю, где я сделал ошибку, и где посмотреть, если это произойдет снова. Я попробую код, когда вернусь домой после выходных: D –