在处理网页时显示加载图标

时间:2014-12-19 19:54:31

标签: android android-asynctask

我的MainActivity调用HandleWebPage.init()来下载和解析网页链接。在init()调用之后,我将得到一组字符串(3个字符串)。每个字符串都显示在单独的片段中(默认的第一个片段带有第一个字符串)。可以通过导航抽屉选择其他片段。

问题是我正在尝试添加进度对话框,该对话框应显示加载图标(旋转圆圈),直到Handle Webpage.init()完成。

init()函数在内部调用2个异步任务;一个是下载网页,另一个是使用jsoup处理网页以获得上面的字符串。

当init()函数被处理并返回到MainActivity时,如何添加进度对话框?

我尝试在AsyncTask中添加init()并在onPreExecution等中放置进度对话框,但是没有用。 还尝试创建progressdialog.show()然后创建一个线程并启动并调用init() 不工作。 我想知道什么是正确的解决方案 以下是代码段。

MainActivity.java /// ------------snip
if(savedInstanceState == null) {
            updateYearMonthDay();  //gets year, month, day
            //hwp is instance of HandleWebPage class
            // hwp.init() internally downloads a webpage and process
            // This takes some time and I require to show some progress around this
            hwp.init(year, month, day);  
            // after complete i get 3 strings which is processed further in below function
            updateMetaData();
            // this show first fragment with fist string in text view.
            SelectItem(0);

        }

HandleWebPage.java
--------------------
public void init()
{
           doc = downloadPage();
           if (doc != null) {
                  extractlinks(doc);
           }
// some other function which uses AsyncTask as 
String = new getmoreInfo().execute(dataString1).get();
}

public Document downloadPage()
{
try {
        doc = new getWebPage().execute(urlString).get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return doc;       
}

public class getWebPage extends AsyncTask<String, Document , Document> {

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Document doInBackground(String... params) {
        try {
            doc = Jsoup.connect(params[0]).timeout(0).get();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if(doc == null) {
            return null;
        } else
            return doc;
    }

    @Override
    protected void onPostExecute(Document doc1) {
        super.onPostExecute(doc1);
    }
};

public void extractLinks(Document doc)
{
// code to process doc using jsoup and update respective String in this class.
}

1 个答案:

答案 0 :(得分:0)

您可以将顺序执行的两个AsyncTask合并到一个AsyncTask中。要在AsyncTask期间显示进度条,请在创建活动时以GONE的可见性初始化进度条。然后在[{1}} VISIBLE方法中将onPreExecute()设置为AsyncTask,并在GONE方法中将其设置回onPostExecute()