我有一个MainActivity类,我从中调用JsonObj类的一个实例。 JsonObj扩展了AsynchTask。它贴在下面:
public class JsonObj extends AsyncTask<String, Void, JSONObject>{
int tid;
String term;
@Override
protected JSONObject doInBackground(String... url) {
// TODO Auto-generated method stub
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(url[0]);
JSONObject jsonObject = null;
// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null){
sb.append(line + "\n");
}
result = sb.toString();
// Log.e("JSON-Test [RESULT]: ", result);
jsonObject = new JSONObject(result);
} catch (Exception e) {
Log.e("JSON-Test [exception]: ", e.toString());
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return jsonObject;
}
@Override
protected void onPostExecute(JSONObject result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
我想要实现的是一个AsyncTask类,我可以从任何将从我的服务器获取并返回JSON的活动调用它。
我的问题是我的AsyncTask类成功提取了我的JSON,但我很难将它传回我的Activity。
我知道OnPostExecute函数在完成AsyncTask时返回数据,但我在Activity类中访问数据的所有尝试都无法正常工作。
我正在使用new JsonObj().execute("http://myserver/json");
来调用我的JsonObj类。
如何调用OnpostExecute直接访问我的AsynchTask从我的服务器获取的数据?这个问题有什么更好的解决方案?
答案 0 :(得分:0)
创建一个接口,其中包含一个名为“onServiceFinished”的方法,您的活动将实现此类调用。然后,当您调用AsyncTask时,传递它(this)并在onPostExectue中,调用FinishedListener.onServiceFinished(var1,var2)或传递的任何数据。
代码示例:此示例使用AsyncTask从服务器检索消息,完成后,将该消息传递给请求它的类
接口:
public interface ServiceHandler {
public abstract void onServiceFinished(JSONObject jsonObject);
}
的活动:
public class YourActivity extends Activity implements ServiceHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
//Activity stuff
new JsonObj(this).execute("http://myserver/json");
}
@Override
public void onServiceFinished(JSONObject jsonObject) {
// Do something with the message
}
}
的AsyncTask:
public class JsonObj extends AsyncTask<String, Void, JSONObject> {
ServiceHandler handler;
public ChatAsync(ServiceHandler serviceHandler) {
handler = serviceHandler;
}
@Override
protected JSONObject doInBackground(String...params) {
// fetch messages from service and parse JSON
}
@Override
protected void onPostExecute(JSONObject json) {
handler.onServiceFinished(json);
}
}
基本型号在那里,你必须修改它以适合你正在做的事情!希望这有帮助
答案 1 :(得分:0)
如果您在一个单独的类中进行所有网络操作,并且您希望调用Activity类的结果。
在调用Activity类上创建onTaskComplete(JsonObject结果)方法。
public void onTaskComplete(JsonObject result) {
//Do You Operation
}
现在你需要在OnPostExecute()
上调用这个方法public class JsonObj extends AsyncTask<String, Void, JSONObject>{
Activity _context;
public JsonObj(Activity _context) {
this._context = _context;
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
this._context.onTaskComplete(result);
}
}
最后调用AsyncTask
new JsonObj(this).execute("YOUR URL");
答案 2 :(得分:0)
执行此操作的最佳方法是使用Callback
。使用此模式,您可以创建在活动中实现的界面。然后,在此接口回调中设置一个方法,以便在onPostExecute()
方法中运行。例如,这个基本的AsyncTask将在完成后调用回调函数:
public class JsonObj extends AsyncTask<Void, Void, JSONObject> {
private OnSuccessListener listener;
private String url;
public JsonObj(String url, OnSuccessListener listener) {
this.url = url;
this.listener = listener;
}
@Override
protected JSONObject doInBackground(Void... params) {
//handle url getter. returning the JSONObject here will send it to the onPostExecute method.
}
@Override
protected void onPostExecute(JSONObject json) {
if (listener != null)
listener.onSuccess(json);
}
public interface OnSuccessListener {
public void onSuccess(JSONObject json);
}
}
然后要正确使用它,只需在您的活动中执行此操作:
new JsonObj("http://myserver/json", new OnSuccessListener() {
@Override
public void onSuccess(JSONObject json) {
//TODO: handle new JSONObject.
}
}).execute();
如果您想要一个更简单的已编码解决方案,请考虑我编写的droidQuery库。除了简化动画和常见UI任务外,它还可以极大地简化这种网络调用。上面的代码可以在 Activity :
中压缩到此$.ajax(new AjaxOptions().url("http://myserver/json")
.type("POST")
.dataType("JSON")
.headers(new Headers().content_type("application/json"))
.success(new Function() {
@Override
public void invoke($ d, Object... args) {
JSONObject json = (JSONObject) args[0];
//TODO: handle json
}
});