【问题标题】:How to parse an xml file while pausing main execution but not the UI如何在暂停主执行而不是 UI 时解析 xml 文件
【发布时间】:2012-01-18 06:02:05
【问题描述】:

我需要解析一个xml文件,大约需要3秒,完成后立即使用从xml文件中解析出来的数据。但是,由于它需要大约 3 秒才能完成,我不只是希望屏幕坐下来等待 3 秒什么都不显示。我希望它显示一个 ProgressDialog。我已经尝试了这些线程中的所有内容,虽然大多数都做 2 / 3,但似乎没有人能做到全部 3。

基本上我有一个按钮,当按下时,我想解析 xml 文件,然后使用从文件中解析的数据:

void onButtonClicked() {

    ProgressDialog pd = new ProgressDialog(this);
    pd.setMessage("Parsing...");
    pd.show();
    String[] ret;
    return = parseXmlFile();
    pd.dismiss();
    if (ret[0] == "steve") {
       sayHiToSteve();
    }
}  

如果我使用 asyncTask,它将继续执行并在任务完成之前检查 ret[0] 并且将只是 null。 如果我执行 AsyncTask.get(),它会暂停执行但不显示进度对话框,所以这也不好。

我也考虑过创建一个单独的线程,但我遇到了同样的问题。我不能使用计时器,因为它大约是 3 秒(但如果连接速度很慢,最多可以达到 4 或 5 秒),所以我无法估算。

非常感谢任何帮助。 提前致谢。

【问题讨论】:

    标签: java android xml android-asynctask


    【解决方案1】:

    您可以为此使用 AsyncTask,例如:

    public class ParseXMLTask extends AsyncTask<Void, Void, String[]>
    {
    
        private ProgressDialog dlg;
    
        @Override
        protected void onPostExecute(String[] result)
        {
            dlg.dismiss();
            if (result[0] == "steve")
            {
                sayHiToSteve();
            }
    
            super.onPostExecute(result);
        }
    
        @Override
        protected void onPreExecute()
        {
            dlg = new ProgressDialog(MyActivity.this);
            dlg.setMessage("Parsing...");
            dlg.setCancelable(false);
            dlg.setIndeterminate(true);
            dlg.show();
    
            super.onPreExecute();
        }
    
        @Override
        protected String[] doInBackground(Void... params)
        {
            return parseXmlFile();
        }
    
    }
    

    然后使用它:

    void onButtonClicked() 
    {
        ParseXMLTask tsk = new ParseXMLTask();
        tsk.execute((Void)null);
    }
    

    【讨论】:

    • 有没有办法等到 tsk.execute((Void)null) 完成后再继续?就像我想做 ParseXMLTask tsk = new ParseXMLTask(); tsk.execute((Void)null);字符串[] ret = tsk.getData(); if (ret == "") { log.e("数据还没有完成"); } 但执行将继续并在解析完成之前命中 getStatement 和 if
    • 您需要做的就是在您需要放入 onPostExecute() 的 parseXmlFile() 之后您想做的任何事情。 doInBackground() 在单独的线程上执行并且不会锁定 UI,当它完成时它会在主线程上调用 onPostExecute()。
    【解决方案2】:
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2023-04-11
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2012-08-21
    相关资源
    最近更新 更多