Android:ProgressDarog中的ProgressBar不是动画

时间:2012-07-24 09:17:56

标签: android android-asynctask

我创建了一个AsyncTask类,用于从后台获取数据(访问数据库)。

onPreExecute()方法中,我创建了一个进度对话框

        try {
            progressDialog = ProgressDialog.show(context, "",
                    "Please wait...", true);
            progressDialog.setIndeterminate(true);

        } catch (final Throwable th) {
            // TODO
        }

在onpostExecute()

        protected void onPostExecute(Boolean result) {

            pinPoint();
            progressDialog.dismiss();
        }

我的更新课程,

@Override
        protected Boolean doInBackground(Void... params) {
            clust = getPinPointClusters();
            runOnUiThread(new Runnable() {
                public void run() {
                    plotClusters(clust);
                }
            });

            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {

            progressDialog.dismiss();
        }

这里的pinpoint()方法将从服务器获取一些数据并固定地图中的点。 但ProgressDialog中的progressBar不是动画...... 请给我最好的方式......

由于

3 个答案:

答案 0 :(得分:2)

我建议你将 pinPoint()方法放在doInBackground method和方法 pinPoint()的行中 < em>影响用户界面 可以保存在此方法::

activityname.runOnUiThread(new Runnable() {
    @Override
        public void run() 
         {
        // Put here the line which is changing the UI.          
     }
});  

示例:当任何行尝试更改doInBackground中的UI时,请执行以下操作:

 protected Boolean doInBackground(final String... args) 
   {
     .
     .
     .
     .     
    activityname.runOnUiThread(new Runnable() {
            @Override
                public void run() 
                 {
                   eg. linearLayout.addView(ChildView);         
             }
        });
     .
     .
     . 
   }

现在,你必须从 onPostExecute()方法 解雇 ProgressDialog

答案 1 :(得分:1)

主动UI线程上出现“动画”。 onPostExecute也可以在UI线程上运行,因此当您拨打服务器时,您可以有效地阻止它。将pinPoint移至doInBackground,以便在后台线程上执行,允许进度对话框保持动画效果。

在更高版本的android(Honeycomb [Android 3.0]以上版本)上运行代码时,在严格模式下也会抛出NetworkOnMainThreadException

如果pinPoint需要更改用户界面,则需要将网络调用分为doInBackground(+数据操作),并且只有用户更改为onPostExecute。您可以将任务的引用保存到数据中,或者将其传递给结果。

您还可以使用publishProgress方法在doInBackground期间发布多个UI更改。

答案 2 :(得分:0)

您已经创建了不同的功能来获取数据和更新UI部分

    private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);

    protected void onPreExecute() {
        this.dialog.setMessage("Please wait");
        this.dialog.show();
    }

    protected Boolean doInBackground(final String... args) {
        try {
            Utilities.arrayRSS = objRSSFeed.FetchRSSFeeds(Constants.Feed_URL);
            return true;
        } catch (Exception e) {
            Log.e("tag", "error", e);
            return false;
        }
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        if (success) {
            // Setting data to list adaptar
            setListData();
            txtTitle.setText(Utilities.RSSTitle);
        }
    }
}