0

我有一个 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,但我正在努力将它传递回我的活动。

我知道 OnPostExecute 函数在我的 AsyncTask 完成时返回数据,但是我所有访问我的 Activity 类中的数据的尝试都不起作用。

new JsonObj().execute("http://myserver/json");用来调用我的 JsonObj 类。

如何调用 OnpostExecute 直接访问我的 AsynchTask 从我的服务器获取的数据,或者有什么更好的解决方案?

4

3 回答 3

0

如果您在一个单独的类中执行所有网络操作,并且您希望调用 Activity 类的结果。

在调用的 Activity 类上创建一个 onTaskComplete(JsonObject result) 方法。

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");
于 2013-10-14T03:12:02.390 回答
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
    }
}

异步任务:

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

基本模型就在那里,你必须修改它以适应你正在做的事情!希望这可以帮助

于 2013-10-14T02:38:44.020 回答
0

最好的方法是使用Callback. 使用此模式,您可以创建一个在Activity中实现的接口。然后,您在此接口回调中设置一个方法以在您的方法中运行。例如,这个基本的 AsyncTask 将在完成时调用回调函数:onPostExecute()

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
    }
});
于 2013-10-16T01:37:52.713 回答