2013-10-14 63 views
0

我有一個MainActivity類,我從中調用JsonObj類的一個實例。 JsonObj擴展了AsynchTask。它的下面粘貼:Android AsynchTask數據返回到活動

public class JsonObj extends AsyncTask<String, Void, JSONObject>{ 
    int tid; 
    String term; 

    @Override 
    protected JSONObject doInBackground(String... url) { 
     // TODO Auto-generated method stub 
     DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
     HttpPost httppost = new HttpPost(url[0]); 
     JSONObject jsonObject = null; 
     // Depends on your web service 
     httppost.setHeader("Content-type", "application/json"); 

     InputStream inputStream = null; 
     String result = null; 
     try { 
      HttpResponse response = httpclient.execute(httppost);   
      HttpEntity entity = response.getEntity(); 

      inputStream = entity.getContent(); 
      // json is UTF-8 by default 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 

      String line = null; 
      while ((line = reader.readLine()) != null){ 
       sb.append(line + "\n"); 
      } 
      result = sb.toString(); 
//   Log.e("JSON-Test [RESULT]: ", result); 
      jsonObject = new JSONObject(result); 
     } catch (Exception e) { 
      Log.e("JSON-Test [exception]: ", e.toString()); 
     } 
     finally { 
      try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
     } 

     return jsonObject; 
    } 

    @Override 
    protected void onPostExecute(JSONObject result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 
} 

我想實現是的AsyncTask類,我可以將獲取並從我的服務器返回JSON的任何活動調用。

我的問題是我的AsyncTask類成功獲取我的JSON,但我努力地將它傳遞迴我的Activity。

我知道OnPostExecute函數返回完成我的AsyncTask的數據,但我所有嘗試訪問我的Activity類中的數據都不起作用。

我正在使用new JsonObj().execute("http://myserver/json");來調用我的JsonObj類。

如何調用OnpostExecute直接訪問數據我的AsynchTask從我的服務器獲取或什麼是更好的解決方案這個問題?

回答

0

創建一個接口,該接口具有一個名爲類似於「onServiceFinished」的方法,您的活動可以實現此調用。然後當你調用你的AsyncTask時,傳遞它(this)和onPostExectue,調用FinishedListener.onServiceFinished(var1,var2)或者你傳遞的任何數據。

代碼示例:此示例使用的AsyncTask從服務器檢索消息,並且結束時,傳回該消息給請求它

接口類:

public interface ServiceHandler { 

    public abstract void onServiceFinished(JSONObject jsonObject); 
} 

活動:

public class YourActivity extends Activity implements ServiceHandler { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     //Activity stuff 
     new JsonObj(this).execute("http://myserver/json"); 
    } 

    @Override 
    public void onServiceFinished(JSONObject jsonObject) { 
     // Do something with the message 
    } 
} 

的AsyncTask:

public class JsonObj extends AsyncTask<String, Void, JSONObject> { 

    ServiceHandler handler; 

    public ChatAsync(ServiceHandler serviceHandler) { 
     handler = serviceHandler; 
    } 

    @Override 
    protected JSONObject doInBackground(String...params) { 
     // fetch messages from service and parse JSON 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 
     handler.onServiceFinished(json); 
    } 
} 

基本模型在那裏,你必須修改它,以適應你在做什麼!希望這有幫助

0

如果你在一個單獨的類中進行所有的網絡操作,並且你希望調用Activity類的結果。

在調用Activity類上創建onTaskComplete(JsonObject結果)方法。

public void onTaskComplete(JsonObject result) { 
    //Do You Operation 
    } 

現在你需要調用OnPostExecute這個方法()

public class JsonObj extends AsyncTask<String, Void, JSONObject>{ 
    Activity _context; 
    public JsonObj(Activity _context) { 
     this._context = _context; 
    } 

@Override 
    protected void onPostExecute(JSONObject result) { 
     super.onPostExecute(result); 
     this._context.onTaskComplete(result); 
    } 
} 

最後通話的AsyncTask

new JsonObj(this).execute("YOUR URL"); 
0

做,這是一個Callback的最好方法。通過此模式,您可以創建一個界面,您可以在活動中執行此操作。然後您在此接口回調中設置一個方法,以在您的onPostExecute()方法中運行。例如,這個基本的AsyncTask將調用回調函數完成時:

public class JsonObj extends AsyncTask<Void, Void, JSONObject> { 

    private OnSuccessListener listener; 
    private String url; 

    public JsonObj(String url, OnSuccessListener listener) { 
     this.url = url; 
     this.listener = listener; 
    } 

    @Override 
    protected JSONObject doInBackground(Void... params) { 
     //handle url getter. returning the JSONObject here will send it to the onPostExecute method. 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 
     if (listener != null) 
      listener.onSuccess(json); 
    } 

    public interface OnSuccessListener { 
     public void onSuccess(JSONObject json); 
    } 
} 

然後正確地使用這個,只是這樣做在你的活動:如果你想要一個簡單的

new JsonObj("http://myserver/json", new OnSuccessListener() { 
    @Override 
    public void onSuccess(JSONObject json) { 
     //TODO: handle new JSONObject. 
    } 
}).execute(); 

,已經編碼的解決方案,請考慮我編寫的droidQuery庫。除了簡化動畫和常見的UI任務之外,它還可以極大地簡化這種網絡調用。上面的代碼可以壓縮到你的活動

$.ajax(new AjaxOptions().url("http://myserver/json") 
         .type("POST") 
         .dataType("JSON") 
         .headers(new Headers().content_type("application/json")) 
         .success(new Function() { 
    @Override 
    public void invoke($ d, Object... args) { 
     JSONObject json = (JSONObject) args[0]; 
     //TODO: handle json 
    } 
}); 
相關問題