2

我正在创建异步任务,检索字符串数据:

View.OnClickListener btnClk = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (btnGetData.getId() == ((Button) v).getId()) {

            Object obj = new FetchTask(Main.this).execute((Integer) null);
        }
    }
};

我的任务:

public class FetchTask extends AsyncTask<Object, Object, Object> {

    private Context ctx;
    private String xml;

    public FetchTask(Context context) {
        ctx = context;
    }

    @Override
    protected void onPreExecute() {
        DialogDownload_Ring = ProgressDialog.show(Main.this, "Download...",
                "Fetching XML data...");
        DialogDownload_Ring.setCancelable(true);
        DialogDownload_Ring.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                // TODO Auto-generated method stub
                cancel(true);
            }
        });
        super.onPreExecute();
    }

    @Override
    protected void onCancelled() {

        super.onCancelled();
    }

    @Override
    protected void onPostExecute(Object result) {

        if (result instanceof Exception) {
            DialogDownload_Ring.setMessage("Download failed!");

        } else {
            DialogDownload_Ring.setMessage("Succesfully Downloaded!");
        }
        DialogDownload_Ring.dismiss();
        super.onPostExecute(result);
    }

    @Override
    protected Object doInBackground(Object... params) {

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(URL_Local);

            HttpResponse httpResponce = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponce.getEntity();
            xml = EntityUtils.toString(httpEntity);
            return xml;
        } catch (Exception e) {
            return e;
        }
    }
}

如何从 Object obj 中检索 xml 数据?obj.toString() 不工作。否则我创建 asynctask 字符串属性(扩展 AsyncTask 字符串、字符串、字符串)它正在工作但进度条在检索 xml 数据后启动,我也不明白。请帮帮我。PS对不起我的英语不好..

4

2 回答 2

3

如果要在doInBackground执行完成后在主 ui 线程中返回结果,则需要通过调用AsyncTask.get()方法执行 AsyncTask,但这将冻结 UI 线程,直到 doInBackground 执行完成。您需要AsyncTask.get()在 Thread 内部调用以避免 UI 冻结。开始AsyncTask在 UI 线程中获取结果:

Object obj = new FetchTask(Main.this).execute((Integer) null).get();

第二种方法是在不调用方法的情况下启动 AsyncTask,并在执行完成时在方法AsyncTask.get中接收结果。在单击按钮时启动 AsyncTask:onPostExecutedoInBackground

new FetchTask(Main.this).execute((Integer) null);

得到结果onPostExecute

 @Override
    protected void onPostExecute(Object result) {

           // extract xml from result 

        super.onPostExecute(result);
    }
于 2013-02-11T06:39:23.510 回答
0

ASyncTask 不能这样工作:

Object obj = new FetchTask(Main.this).execute((Integer) null);

execute 方法立即返回,任务在后台继续执行。

ASyncTask 是异步的,所以这就是为什么它有onPostExecute方法在它完成时做一些事情。将处理返回项目 (xml) 的代码放入onPostExecute关闭对话框之前或之后。

于 2013-02-11T06:37:48.253 回答