2017-02-22 53 views
-1

我有外部類擴展AsyncTask從網站獲取字符串解析爲JSONObjectJSONArray。目前,我正在使用方法.get()獲得結果,但應用程序正在丟幀,等待服務器響應。我想使用它可重用,因爲我從許多不同的類獲取數據。 我的AsyncTask類:如何從AsyncTask獲取結果而不阻塞UI線程?

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()'返回異步任務實例本身,而不是'String'或任何其他類型的結果。 –

回答

1

按照文檔get方法:

如有必要,等待計算完成,然後檢索其結果。

因此,它會阻止用戶界面,直到它完成後臺任務,它將返回結果。

您可以創建一個偵聽器,該偵聽器接受您的JsonTaskdoInBackground的返回值,onPostExecute將調用偵聽器。

0

我想你可以再次閱讀document

當執行一個異步任務,任務經過4個步驟:

  1. onPreExecute()
  2. doInBackground(參數...)
  3. onProgressUpdate(進步...)
  4. onPostExecute(Result),在後臺計算完成後在UI線程上調用。後臺計算的結果作爲參數傳遞給此步驟。
相關問題