通过asynctask将json返回给活动

时间:2015-07-09 01:26:10

标签: android json android-asynctask execute

我使用doInBackground方法从Web服务获取json,所以我可以在我的主要活动中使用它,我做了什么,但它没有工作

public class JSONTransmitter extends AsyncTask<JSONObject, JSONObject, JSONObject> {
 @Override
 protected JSONObject doInBackground(JSONObject... data) {
 //.....    
    return json;
 }

 @Override
 protected void onPostExecute(JSONObject jsonObject) {
    super.onPostExecute(jsonObject);

 }
}

这是我的主要活动

public void sync(View v){
    LocationsDB mLocationsDB = new LocationsDB(SupportMapActivity.this);
    Cursor events= mLocationsDB.getAllLocations();

    try {
        JSONObject json=makJsonObject(events);
        JSONTransmitter transmitter = new JSONTransmitter();
        AsyncTask<JSONObject, JSONObject, JSONObject> jsonRetour = transmitter.execute(new JSONObject[]{json}); 
//I want to use it here like jsonRetour.getString("something");

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:0)

在JSONTransmitter中,您需要对onPostExecute()中的JSON对象执行某些操作。目前,您的异步任务不会对其执行任何操作。

试试这个:

在Main活动中,有一个名为mJson的JSONObject var,并在你的onPostExecute中执行此操作:

protected void onPostExecute(JSONObject jsonObject) {
  super.onPostExecute(jsonObject);
  mJson = jsonObject;
  // call a method from the MainActivity to do whatever needs to be done with the JSON
}

当然,为了实现这一点,AsyncTask必须是Main Activity的内部类。

答案 1 :(得分:0)

有多种方法可以做到这一点,但我最喜欢的一种方法是使用回调界面。

这是JSONTransmitter:

public class JSONTransmitter extends AsyncTask<JSONObject, JSONObject, JSONObject> {

    private OnJsonTransmitionCompleted mCallback;

    public JSONTransmitter(OnJsonTransmitionCompleted callback) {
        this.mCallback = callback;
    }

    @Override
    protected JSONObject doInBackground(JSONObject... data) {
        //.....    
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        this.mCallback.onTransmitionCompleted(jsonObject);
    }

    public interface OnJsonTransmitionCompleted {
        void onTransmitionCompleted(JSONObject jsonObject);
    }
}

回调界面OnJsonTransmitionCompleted位于JSONTrasnmitter内,因为它唯一用于JSONTransmitter

以下是主要活动:

public class SupportMapActivity extends Activity implements JSONTransmitter.OnJsonTransmitionCompleted{

    public void sync(View v){
        LocationsDB mLocationsDB = new LocationsDB(SupportMapActivity.this);
        Cursor events= mLocationsDB.getAllLocations();

        try {
            JSONObject json = makJsonObject(events);
            JSONTransmitter transmitter = new JSONTransmitter(this);
            transmitter.execute(new JSONObject[]{json}); 

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onTransmitionCompleted(JSONObject jsonObject) {
        // Now you have access to your JSON data in your activity!
    }
}

因此,我们在JSONTransmitter内创建了一个回调接口,其中有一个方法void onTransmitionCompleted(JSONObject jsonObject),可将JSONObject传递给onPostExecute(JSONObject jsonObject)的活动。

在主要活动中,我们实施JSONTransmitter.OnJsonTransmitionCompleted并在我们实例化this时传入JSONTransmitter,最后我们在活动中覆盖void onTransmitionCompleted(JSONObject jsonObject),并在我们AsyncTask之后已完成后台处理并且onPostExecute(JSONObject jsonObject)已被调用,我们将在已实施的方法JSONObject内收到onTransmitionCompleted(JSONObject jsonObject)

我希望这有助于此主题的一些链接:

android asynctask sending callbacks to ui

http://android-er.blogspot.co.il/2013/09/implement-callback-function-with.html

http://blog.redkitmedia.com/android-asynctask-sending-callbacks-to-ui/

http://android-dwivediji.blogspot.co.il/2014/01/best-way-to-use-asynctask-class.html