1

我创建了一个 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 没有动画...请给我最好的方法...

谢谢

4

3 回答 3

2

我建议您将pinPoint() 方法放在影响 UIdoInBackground method的方法pinPoint()中的行可以保留在此方法下:

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

于 2012-07-24T09:30:41.180 回答
1

“动画”发生在主 UI 线程上。onPostExecute也运行在 UI 线程上,因此当您调用服务器时,您实际上是在阻止它。移动pinPointdoInBackground它在后台线程上执行,允许进度对话框保持动画。

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

如果pinPoint需要更改 UI,则需要将网络调用分离为doInBackground(+ 数据操作),并且只有 UI 更改为onPostExecute. 您可以保留对数据的任务引用或将其作为结果传递。

您还可以使用该publishProgress方法,在doInBackground.

于 2012-07-24T09:27:23.247 回答
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);
        }
    }
}
于 2012-07-24T09:23:30.660 回答