2017-02-22 29 views
-1

У меня есть внешний класс, расширяющий AsyncTask, чтобы получить строку с сайта, чтобы разобрать ее как JSONObject или JSONArray. В настоящее время я использую метод .get(), чтобы получить результат, но приложение отбрасывает фреймы, ожидая ответа сервера. Я хочу использовать его повторно, потому что я получаю данные из разных классов. Мой AsyncTask класс:Как получить результат от AsyncTask без блокировки потока пользовательского интерфейса?

public class JsonTask extends AsyncTask<String, String, String> { 
    protected String doInBackground(String...params) { 

     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      Log.d("Response: ", "> Establishing Connection"); 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 


      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 

      while ((line = reader.readLine()) != null) { 
       buffer.append(line + "\n"); 
       Log.d("Response: ", "> " + line); 

      } 

      return buffer.toString(); 


     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    }} 

Теперь я получаю данные просто:

String result = new JsonTask().execute(url).get(); 
+0

@RichArt - Возможно, потому что 'AsyncTask.execute()' возвращает сам экземпляр async-задачи, а не 'String' или какой-либо другой результат. –

ответ

1

Согласно документации для метода GET:

Уэйтс если это необходимо для вычисления для завершения, и затем извлекает его результат.

Поэтому он блокирует пользовательский интерфейс, пока не завершит фоновое задание, которое вернет результат.

Вы можете создать слушатель, который принимает возвращаемое значение doInBackground в вашем JsonTask, которое onPostExecute будет вызывать слушателя.

0

Думаю, вы можете читать document еще раз.

Когда асинхронная задача выполняется, задача проходит через 4 этапа:

  1. onPreExecute()
  2. doInBackground (Params ...)
  3. onProgressUpdate (Прогресс ...)
  4. onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения фонового вычисления. Результат вычисления фона передается на этот шаг в качестве параметра.