Вернуть json к активности с помощью asynctask

Я использую метод doInBackground, чтобы получить 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 ответа

Решение

Есть несколько способов сделать это, но один из моих любимых способов с интерфейсом обратного вызова.

Вот 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 отправка обратных вызовов для пользовательского интерфейса

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

В JSONTransmitter вам нужно что-то сделать с объектом JSON в onPostExecute(). На данный момент ваша асинхронная задача ничего с этим не делает.

Попробуй это:

В действии Main создайте переменную JSONObject с именем mJson, а в 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.

Другие вопросы по тегам