我使用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();
}
}
答案 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