如何使用界面更新异步任务中的进度条

     2023-05-07     9

关键词:

【中文标题】如何使用界面更新异步任务中的进度条【英文标题】:How to update the Progress Bar in Async Task with interface 【发布时间】:2017-11-26 16:18:16 【问题描述】:

我创建了一个应用程序,其中我使用了 Fragment 类和另一个 Async 类来下载两个不同的类现在我必须显示进度条水平更新进度条在 onProgressUpdate 中发生了多少下载。但是 onProgressUpdate 回调不起作用的接口,它没有更新 ProgressBar。

FragmentA.class

private void downloadAndUnzipContent(String url)
    progressBar.setVisibility(View.VISIBLE);
    progressBar.setProgress(0);
    DownloadFileAsync download = new DownloadFileAsync(path+"content.zip", mContext,
            new DownloadFileAsync.PostDownload()
        @Override
        public void downloadDone(File file) 
            Log.i(TAG, "file download completed");
        
    , new DownloadFileAsync.ProgressUpdate() 

        @Override
        public void ProgressUpdate(int progress) 
            progressBar.setProgress(progress);
        

    );
    download.execute(url);

在我下载文件的 DownloadFileAsync.class 中:

public class DownloadFileAsync extends AsyncTask<String, Integer, String> 

private static final String TAG = "DOWNLOADFILE";

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private PostDownload callback;
private ProgressUpdate callProgress;
private Context context;
private FileDescriptor fd;
private File file;
private String downloadLocation;

public DownloadFileAsync(String downloadLocation, Context context, PostDownload callback, ProgressUpdate callProgress) 
    this.context = context;
    this.callback = callback;
    this.callProgress = callProgress;
    this.downloadLocation = downloadLocation;


@Override
protected void onPreExecute() 
    super.onPreExecute();


@Override
protected String doInBackground(String... aurl) 
    int count;

    try 
        URL url = new URL(aurl[0]);
        URLConnection connection = url.openConnection();
        connection.connect();

        int lenghtOfFile = connection.getContentLength();
        Log.d(TAG, "Length of the file: " + lenghtOfFile);

        InputStream input = new BufferedInputStream(url.openStream());
        file = new File(downloadLocation);
        FileOutputStream output = new FileOutputStream(file); //context.openFileOutput("content.zip", Context.MODE_PRIVATE);
        Log.d(TAG, "file saved at " + file.getAbsolutePath());
        fd = output.getFD();

        byte data[] = new byte[1024];
        long total = 0;
        while ((count = input.read(data)) != -1) 
            total += count;
            publishProgress((int) ((total * 100) / lenghtOfFile));
            output.write(data, 0, count);
        

        output.flush();
        output.close();
        input.close();
     catch (Exception e) 
    
    return null;



protected void onProgressUpdate(Integer... progress) 
    //Log.d(TAG,progress[0]);
    if(callProgress != null)
        callProgress.ProgressUpdate(progress[0]);


@Override
protected void onPostExecute(String unused) 
    //progressBar.setVisibility(View.GONE);
    if (callback != null) callback.downloadDone(file);


public  interface PostDownload 
    void downloadDone(File fd);


public interface ProgressUpdate 
    void ProgressUpdate(int progress);


我的代码有错误吗?

【问题讨论】:

***.com/questions/3028306/… 不需要接口,直接从异步任务类中完成 你只需要通过一个活动来保存片段的Ui元素的引用,你可以直接从异步类的onProgressUpdate更新进度条,因为你有上下文变量 【参考方案1】:

您的代码没有问题。 请调试检查

 int lenghtOfFile = connection.getContentLength();

“lenghtOfFile”是正确的。 并非所有服务器都返回 ContentLength。 有时是 -1。

【讨论】:

【参考方案2】:

您不能在 UI 线程之外修改 UI。快速修复可能是:

    yourFragment.getActivity().runOnUiThread(new Runnable()
    
        @Override
        public void run()
        
            progressBar.setProgress(progress);
        
    );

【讨论】:

如何在android开发中用asynctask异步更新ui界面

  1  本次的异步处理的一种方式AsyncTask,其实它的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler传递消息的方式,... 查看详情

我如何在我的异步任务类中使用圆形旋转进度条

】我如何在我的异步任务类中使用圆形旋转进度条【英文标题】:Howicanusecircularspinningprogressbarinmyasynctaskclass【发布时间】:2019-06-0221:46:09【问题描述】:我想在asynctask类中使用旋转进度条。下面是我的asynctask类代码。在我使用... 查看详情

如何在service中同步更新通知activity中的进度条

...项的下载进度条和下载控制按钮(暂停,删除等)问题:如何在service中实现notification和activity中进度条的同步更新?(注:不用广播)方法1、使用Handler在Service发送进度消息2、activity中实现一个回调的接口,然后注册到服务里3... 查看详情

android,异步任务类中的toast如何获得context?

MainActivity.javanewAsync().execute()Async.javaToast.makeText(这里怎么取得上下文对象让其在MainActivity中显示出来,"内容",1).show();参考技术AAsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。AsyncTask是个抽象类,使用时... 查看详情

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?

】当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?【英文标题】:Howtoshowprogressbarbeforefragmentloadingwhenfragmentviewloadingispartofasynctask?【发布时间】:2018-04-1621:50:48【问题描述】:我有一个片段来显示日历... 查看详情

如何使用我的 PHP 脚本中的数据动态更新引导进度条?

】如何使用我的PHP脚本中的数据动态更新引导进度条?【英文标题】:HowdoIdynamicallyupdateabootstrapprogressbarwithdatafrommyPHPscript?【发布时间】:2017-01-3112:35:07【问题描述】:我的网页上有一个引导进度条<divclass="progress"><divclass=... 查看详情

如何在 Ui_MainWindow 中更新 pyqt5 进度条

】如何在Ui_MainWindow中更新pyqt5进度条【英文标题】:HowdoIupdatepyqt5progressbarinUi_MainWindow【发布时间】:2018-03-3023:16:16【问题描述】:我尝试使用pyqt5实时更新进度条,但是,目前在线文档似乎非常有限。我在网上读到我可以使用线... 查看详情

根据 API 的响应异步更新进度条

...时,API将开始安装我的设备,并返回taskID监控API然后我将使用taskID传递给另一个API调用以跟踪安装进度。MonitorAPI将返回一个介于1到200之 查看详情

如何为 Windows 7 编写进度条以在任务栏上进行自我更新?

...应用程序可以通过状态栏报告当前活动的进度。例如,当使用Windows资源管理器复制文件时,任务栏中的应用程序图标上方会出现一个进度条,并在 查看详情

如何使用 Cocoa Bindings 使用 NSProgress 更新进度条?

】如何使用CocoaBindings使用NSProgress更新进度条?【英文标题】:HowdoIupdateaprogressbarusingNSProgressusingCocoaBindings?【发布时间】:2014-04-0722:47:56【问题描述】:我一直在尝试使用新的NSProgress类来报告我的Mac应用程序中的操作进度。现... 查看详情

android如何实现弹出一个进度条后,再弹出一个倒计时的界面。

实现流程 StepOne弹出进度条对话框 StepTwo执行线程,在线程中实现数据的异步加载 StepThree在线程数据加载完成后,调用Handler并集合数据,更新界面Java代码  //添加异步操作               m_Dialog=ProgressDialog.show(m_context,"... 查看详情

显示下载进度条

...想添加一个水平进度条来显示下载进度。但我面临错误。如何在不使用异步任务的情况下在此代码中添加进度条?privateclassExecutorServiceDownloadimplementsRunnableprivateStringurl;p 查看详情

androidasynctask怎么用

...线程中执行,而很多时候,UI界面更新比较耗时,如果不使用异步加载方式实现的话,很容易导致ANR异常。出于安全考虑,一些耗时操作最好用异步方式实现。AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实... 查看详情

尝试连接到服务器时带有异步任务的进度条

】尝试连接到服务器时带有异步任务的进度条【英文标题】:ProgressbarwithAsyncTaskwhiletryingtoconnecttoserver【发布时间】:2020-03-1302:24:00【问题描述】:我想在AsyncTask类的doInbackground方法执行后台任务时显示进度对话框,但问题是当我... 查看详情

多线程任务更新 1 个进度条 - UI C# WPF

...四处寻找有类似问题的人,但没有找到任何东西。我正在使用WPFUI编写C#应用程序。要更新进度条,我不能像以前(在CLI中)那样使用多线程,因为它告诉我如果UI元素不是来自主线程,我就无法更新它。一种解决方案是创建后台 查看详情

异步任务的进度对话框

...,扩展至Asynctask。有一个名为setting的类,调用server类来更新server中的数据。传递上下文的Mainactivity代码:Server.setActivityContext(getApplicati 查看详情

表单最小化时在任务栏中显示进度条

...zed【发布时间】:2012-02-1302:31:02【问题描述】:我想知道如何完成以下操作:我想在我的窗口最小化时在任务栏上显示进度条的进度。请参阅here以获得视觉描述。看看任务栏上的图标是如何随着窗口中的主进度条逐渐变成绿色... 查看详情

androidasynctask异步任务的使用(代码片段)

文章目录小结定义异步任务类开启异步任务参考小结可以使用androidAsyncTask来执行繁重的后台任务,以避免UI界面无响应,并可以实时在UI界面上显示进度。定义异步任务类定义一个异步任务类,在里面覆盖几个方法onPr... 查看详情