2014-01-13 4 views
-1

Как я могу отправить различные аргументы типа в AsyncTask.AsyncTask, чтобы избежать NetworkOnMainThread

Я развиваю систему входа в android, используя J Son/php. Я получил NetworkOnMainThread Exception, и мне предложили реализовать AsyncTask в моем коде. Мне нужно отправить URL в строку и List. Как я могу отправить это функции? Эти значения отправляются из другого класса.

public class JSONParser extends AsyncTask<String,Void,JSONObject> 

Я не знаю, верю я или нет. В ожидании ответа.

вот моя модификация сделал

private String url; 
private List<NameValuePair> params; 
@Override 
protected JSONObject doInBackground(String... args) { 

    return getJsonFromURL(url,params); 
} 

void callJson(String url,List<NameValuePair> params){ 
    this.url=url; 
    this.params=params; 
} 

Я зову AsyncTask как этот путь:

jsonParser=new JSONParser(); 
    jsonParser.setter(LoginUrl, username,password); 
    try { 
     jsonObject= jsonParser.execute("").get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

    return jsonObject; 

Теперь я получаю эту ошибку.

2843-2858/? E/JSON Parser﹕ Error parsing data org.json.JSONException: Value loginRegistration of type java.lang.String cannot be converted to JSONObject 
    01-07 10:04:09.808 2843-2843/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     Process: artha.ordermaking.KOT, PID: 2843 
     java.lang.NullPointerException 
       at 

    ex.WelcomeActivity$PlaceholderFragment.loginProcess(WelcomeActivity.java:84) 
        at ex.WelcomeActivity$PlaceholderFragment$1.onClick(WelcomeActivity.java:118) 

Обратите внимание, что я изменил свой код, представленный выше.

+2

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

+0

Я пробовал свой уровень лучше. Но все равно получил Исключение. –

+1

Если у вас есть проблемы с вашим кодом, подумайте о включении соответствующих вопросов в вопрос, с исключением stacktrace из logcat. – laalto

ответ

0

Вы должны вызвать вашу задачу асинхронной с execute(), а не прямым вызовом метода doInBackground() на это в потоке пользовательского интерфейса, о чем свидетельствует StackTrace:

at artha.ordermaking.KOT.library.JSONParser.doInBackground(JSONParser.java:36) 
at artha.ordermaking.KOT.library.UserFunctions.loginUser(UserFunctions.java:37) 

Из комментариев:

jsonObject = jsonParser.execute(); Это не работает. Мне нужно получить JSONObject. execute() возвращает объект AsyncTask.

Это не было бы асинхронной задача, если вы ждали его завершения.

Вместо этого выполните всю обработку в doInBackground() и обновите свой интерфейс пользователя в onPostExecute(), который имеет доступ к результату doInBackground(). Это обновление также может включать вызов метода обратного вызова в вашем коде интерфейса.

В обновленной вопрос:

jsonObject= jsonParser.execute("").get(); 

get() это неправильное решение. Он блокирует текущий поток (поток пользовательского интерфейса), пока задача async не завершится. Итак, вы вернулись туда, откуда вы начали: предотвращение сетевой операции для блокировки потока пользовательского интерфейса.

+0

jsonObject = jsonParser.execute(); Это не работает. Мне нужно получить JSONObject. execute() возвращает объект AsyncTask. –

+0

Как получить Возвращенный JSONObject ?? –

+0

В 'onPostExecute()' arg или хранить в элементе var. – laalto

0

Три типа, используемый асинхронная задача являются следующим:

Первый, Params, типа параметров посланы к задаче при выполнении . Второй, Progress, тип единиц измерения , опубликованный во время фонового вычисления. Третий, Результат, тип результата фонового вычисления.

Если вам нужно передать дополнительные данные в вашу AsyncTask, просто создайте метод, который будет получать эти данные в вашей AsyncTask и вызовет его в основном пользовательском интерфейсе. Например:

public void setMyHandler(Handler h) { myhandler = h; } 

Вы сможете найти более подробную информацию на странице AsyncTask помощи, here.

0

Вы можете создать Constructor в своем классе AsyncTask и можете получить данные в нем.

Параметры являются следующими AsyncTask <TypeOfVarArgParams , ProgressValue , ResultValue> .

TypeOfVarArgParams передается в метод doInBackground() в качестве входных данных, ProgressValue используется для получения информации о ходе и ResultValue должны быть возвращены из doInBackground() метода и передается onPostExecute() в качестве параметра.

Как всегда вы можете найти этот учебник очень полезным для изучения этой темы. Вот учебник Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial

-1

Довольно простой способ избежать NetworkOnMainThreadException

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
     .permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

поместить эти строки в onCreate(Bundle savedInstanceState) метод деятельности

+3

Это просто скрывает проблему и не решает проблему. – laalto

+1

Это не очень хорошая практика. Поэтому я решил использовать AsyncTask. –

0

Вы можете определить класс содержит все необходимые данные, и использование, что class как параметр для AsyncTask. Или, если параметр AsyncTask раздражает вас, вы можете использовать runOnUiThread и нить:

class Login implements Runnable{ 
    public Login(parameters...){  
    } 
    @Override 
    public void run() { 
      //Login 
      runOnUiThread(new LoginResult(params...)); 
    } 
} 

class LoginResult implements Runnable{ 
    public Login(parameters...){  
    } 
    @Override 
    public void run() { 
    } 
} 

....

new Thread(new Login()).start(); 
+0

Неверный формат. runOnUiThread работает по ui-потоку, который побеждает цель не запускать нить ui. – njzk2

+0

Извините, забудьте об этом. См. Мой отредактированный. – xtr