上一篇文章 實現android非同步呼叫WEB API的方法 在做完了事之後沒有告訴主線程,我在這裡改進一下讓他在完事後可以告訴主線程,這樣就比較實用了
首先定義一個介面並簡單實現一下,onTaskCompleted 就是我們將來完成非同步後腰回調的方法:
public interface OnTaskCompleted{ void onTaskCompleted(JSONObject result);}public class Callback implements OnTaskCompleted{ @Override public void onTaskCompleted(JSONObject result) { // do something with result here! }}
然後修改我的非同步呼叫的代碼
public class ApiCall extends AsyncTask { private OnTaskCompleted listener; private String result; public ApiCall(OnTaskCompleted listener){ this.listener=listener; } protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; StringBuilder resultBuilder = new StringBuilder(); for (int i = 0; i < count; i++) { try { // Read all the text returned by the server InputStreamReader reader = new InputStreamReader(urls[i].openStream()); BufferedReader in = new BufferedReader(reader); String resultPiece; while ((resultPiece = in.readLine()) != null) { resultBuilder.append(resultPiece); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // if cancel() is called, leave the loop early if (isCancelled()) { break; } } // save the result this.result = resultBuilder.toString(); return totalSize; } protected void onProgressUpdate(Integer... progress) { // update progress here } // called after doInBackground finishes protected void onPostExecute(Long result) { Log.v("result, yay!", this.result); // put result into a json object try { JSONObject jsonObject = new JSONObject(this.result); // call callback listener.onTaskCompleted(jsonObject); } catch (JSONException e) { e.printStackTrace(); } }}
調用就很簡單了
URL url = null;try { url = new URL("http://127.0.0.0/search");} catch (MalformedURLException e) { e.printStackTrace();}new ApiCall(new Callback()).execute(url);