0

我有一个同步服务,我想要一个进度条,因为同步所有数据需要超过 1 分钟,而且我不想使用不确定的进度。我有一个用于同步功能的处理程序,并且正在引用并正确更新进度条的进度,但 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);
}

我曾尝试使用 异步任务 类但没有成功。任何帮助表示赞赏。

4

2 回答 2

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()用于更新的方法UI。但是,如果您愿意,可以看看AsyncTask

问候

于 2012-06-06T18:03:08.377 回答
1

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

请参阅此示例并将您的同步代码放入doInBackground method

于 2012-06-06T17:58:50.180 回答