Вернуть 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.