Android AsynchTask数据返回Activity

时间:2013-10-14 02:21:45

标签: java android json android-asynctask

我有一个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从我的服务器获取的数据?这个问题有什么更好的解决方案?

3 个答案:

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