我确实有线程问题:
我在一项 Activity 中需要进行一些网络操作(下载)。我为此编写了一个线程,以便这发生在我的 UI 线程的后台。但我在某种程度上做错了,我不知道如何解决这个问题。我的代码是:
private void startDownload(){
progressBar.setVisibility(View.VISIBLE);
Downloader loader = new Downloader();
loader.start();
try {
loader.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
现在的问题是,当加载程序即将完成时,会出现进度条。在我启动加载程序之前它不会显示。我认为这是因为我用我的 UI 线程 join() 加载器,但我不知道如何规避这个问题。我必须等待加载程序完成,因为以下代码将处理从加载程序下载的文件。
我有一个想法:我可以使用像这样的循环
while(loader.isAlive()){
//doSomething
}
但我不确定这是否能解决我的问题。
编辑:
好吧,我将用 AsyncTask 替换我的线程。这似乎是有道理的,因为我需要 UI 中的数据来进一步推进我的程序。
但是有人可以向我解释一下为什么我的进度条没有显示,尽管我在启动加载器线程之前将 Visibility 设置为 TRUE?谢谢!
最佳答案
您需要在后台线程上执行下载操作并从 UI 线程更新 UI。
为此,您可以使用 AsyncTask :
像这样:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
// TODO do actual download
// publish your download progress
publishProgress(count);
return null; // TODO insert your result
}
protected void onProgressUpdate(Integer... progress) {
// TODO set progress to progressbar
// update UI
}
protected void onPostExecute(Long result) {
// called when download is complete
// update UI
}
}
开始下载:
private void startDownload() {
progressBar.setVisibility(View.VISIBLE);
asyncTask = new DownloadFilesTask();
asyncTask.execute(<urls for download>);
}
关于java - 线程和用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23673925/