java - 线程和用户界面

标签 java android multithreading user-interface

我确实有线程问题:

我在一项 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/

相关文章:

C#线程不释放内存

Java:生命游戏 - 与邻居的问题

android - 极慢的AVD完全分配资源

java - Android Studio - - MainActivity 中只有 1 个按钮播放声音

java - 如何将数据从线程发送到主要 Activity java android

c - 时间片是如何在进程中的 pthreads 之间划分的?

java - 如何在我的组织中创建员工层次结构

java日历,当前日期错误

java - 组织.hsqldb.HsqlException : data exception: invalid character value for cast

android - edittext 光标和编辑区域不显示