从Handler中更新ProgressBar

时间:2012-06-06 17:55:01

标签: android android-widget

我有一个同步服务,我想要一个进度条,因为同步所有数据需要> 1分钟,我不想使用不确定的进度。我有一个用于同步功能的处理程序,并且正在引用并正确更新progressBar的进度,但UI不会更新。

  Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 //Sync calls
                     updateProgress(getContext());
                }
 };
 public static void updateProgress(Context c){
    layout = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    progress_view = layout.inflate(R.layout.sync_dialog, null);

    mProgressStatus += mProgressStep;
    mProgress = (ProgressBar) progress_view.findViewById(R.id.progress);

    mProgress.setProgress(mProgressStatus);
}

我尝试过使用ASynchTask类但没有成功。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

这是我正确使用Handler

的例子
Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            bar.incrementProgressBy(5);
            if (bar.getProgress() == 100) {
                bar.setProgress(0);
                Toast.makeText(ThreadsDemoActivity.this, "Progress is finished.", Toast.LENGTH_SHORT).show();
            }
        }
    };

然后你必须创建Thread(现在它只做一些模拟或工作)

@Override
    public void onStart() {
        super.onStart();
        bar.setProgress(0);
        Thread backgroundThread = new Thread(new Runnable() {
            public void run() {
                try {
                    for (int i = 0; i < 20 && isRunning; i++) {
                        Thread.sleep(300);
                        handler.sendMessage(handler.obtainMessage());
                    }
                }
                catch (Throwable t) {

                }
            }
        });
        isRunning = true;
        backgroundThread.start();
    }

public void onStop() {
        super.onStop();
        isRunning = false;
    }

同样在onCreate方法中,您必须声明并初始化progressBar

bar = (ProgressBar) findViewById(R.id.progBar)

所以这很好但并非总是如此。更复杂的方法提供AsyncTask。这是一个非常复杂和强大的工具,当我向你推荐一些如此清楚的东西时AnyncTask。它是泛型类型,有一个名为doInBackground()的方法,用于长时间任务并将您的任务转移到后台。有一条规则是您无法从后台线程更新UI。您不得不AsyncTask提供用于更新onProgressUpdate()的{​​{1}}方法。但是,如果你愿意,请查看AsyncTask

此致

答案 1 :(得分:1)

您应该使用Thread AsyncTask,并且只有处理程序更新progressBar,同时您同步所有数据。

See this Example并将您的同步代码放入doInBackground method