return json 到 activity 通过 asynctask

return json to activity by asynctask

我正在使用 doInBackground 方法从 Web 服务中获取 json,这样我就可以在我的主程序中使用它 activity 这是我所做的,但它不起作用

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);

 }
}

这是我的主要内容 activity

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();
    }
}

在JSON发送器中,您需要在onPostExecute() 中对JSON 对象做一些事情。目前,您的 Async 任务对它没有任何作用。

试试这个:

在 Main activity 中,有一个名为 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 上的内部 class。

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

这是 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.

这里是主要的activity:

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) 可以将 JSONObjectonPostExecute(JSONObject jsonObject) 传递给您的 activity。

在主 activity 中,我们实现 JSONTransmitter.OnJsonTransmitionCompleted 并在实例化 JSONTransmitter 时传入 this,最后我们在 [=53] 中覆盖 void onTransmitionCompleted(JSONObject jsonObject) =] 一旦我们的 AsyncTask 完成其后台进程并且 onPostExecute(JSONObject jsonObject) 被调用,我们将在实现的方法 onTransmitionCompleted(JSONObject 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