我有一个同步服务,我想要一个进度条,因为同步所有数据需要> 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类但没有成功。任何帮助表示赞赏。
答案 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