Android - 创建由线程填充的进度对话框

时间:2012-01-19 22:05:17

标签: android

首先让我解释一下这是我的第一款Android应用。所以我还没有完全掌握所有概念。我希望这个问题与缺乏知识有关,但这次我似乎无法解决这个问题的解决方案。

我有这段代码从远程Mysql数据库中获取一些数据来填充ListView。这很好用。

// fetch family and determine length of the arrays
Familielid[] familie = Mysql.getFamilie();
int len = familie.length;
namen = new String[len]; // groups
lijsten = new String[len][];  // children

// loop through the family and fill names and lists
for (int i=0; i<len; i++)
{
    namen[i] = familie[i].getNaam();
    Lijst lijst = new Lijst(Mysql.getLijst(familie[i].getId()));
    lijsten[i] = lijst.getOmschrijvingen();
}

现在因为这可能需要一些时间,我想显示一个进度条,为每个已加载的“Familielid”(=系列成员)填充。 (我想这样做主要是为了找出怎么做) 但是,此代码会引发应用程序错误。 :(

// show progress bar while loading 
ProgressDialog progressDialog = new ProgressDialog(VerlanglijstenActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Lijstjes ophalen...");
progressDialog.setCancelable(false);
progressDialog.show();

// load lijstjes with progress bar
Thread loadLijstjes = new Thread(new Runnable() {
    public void run() {
        // fetch family and determine length of the arrays
        Familielid[] familie = Mysql.getFamilie(); 
        int len = familie.length;
        namen = new String[len]; // groups
        lijsten = new String[len][];  // children

        // loop through the family and fill names and lists
        for (int i=0; i<len; i++)
        {
            namen[i] = familie[i].getNaam();
            Lijst lijst = new Lijst(Mysql.getLijst(familie[i].getId()));
            lijsten[i] = lijst.getOmschrijvingen();
            // show progress
            progressDialog.incrementProgressBy((int) Math.floor(100/len));
        }
        progressDialog.setProgress(100); // just make sure it's 100% when we're done
        progressDialog.dismiss() ; // close the progress bar
    }
});
loadLijstjes.start();

知道我做错了什么吗?或者它应该以完全不同的方式完成?

1 个答案:

答案 0 :(得分:1)

以下是处理threading in Android的一些方法的良好开端的文档。您的问题的根源是您尝试从非UI线程更新UI。您可以通过按照文档中的说明在AsyncTask中处理后台工作,并将进度更新放在onProgressUpdate方法中,从而最轻松地解决此问题。