Activity with ProgressBar -> Service -> AsyncTask 用于下载 - 但如何更新进度?

2024-01-27

这是当前的状态/情况:我有一个 Activity 绑定了一个 Service,该 Service 创建了下载各种 Web 资源的 AsyncTasks。这很好用,但是进度条当然什么也不显示。

以前我有一个 Activity 创建了一个下载了一些东西的 AsyncTask 。 AsyncTask 获取保存 ProgressBar 的视图。所以我可以使用 onProgressUpdate 和publishProgress 更新进度。显然这不再有效,因为我没有引用 ProgressBar。

那么,您知道如何更新进度吗?

提前致谢。


非常好的解释确实只是缺少示例:) 我去扔它,它就在这里。

public class Detail extends Activity {

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(DownloadService.CUSTOM_INTENT)) {
                mProgressDialog.setProgress(intent.getFlags());
            }
        }
    };

    // Flag if receiver is registered 
    private boolean mReceiversRegistered = false;
    // Define a handler and a broadcast receiver
    private final Handler mHandler = new Handler();

    @Override
    protected void onResume() {
      super.onResume();

      // Register Sync Recievers
      IntentFilter intentToReceiveFilter = new IntentFilter();
      intentToReceiveFilter.addAction(DownloadService.CUSTOM_INTENT);
      this.registerReceiver(mIntentReceiver, intentToReceiveFilter, null, mHandler);
      mReceiversRegistered = true;
    }

    @Override
    public void onPause() {
      super.onPause();

      // Make sure you unregister your receivers when you pause your activity
      if(mReceiversRegistered) {
        unregisterReceiver(mIntentReceiver);
        mReceiversRegistered = false;
      }
    }
}








public class DownloadService extends Service {
    private static final String CLASS_NAME = DownloadService.class.getSimpleName();
    private List<Download> downloads = new ArrayList<Download>();
    private int currentPosition;
    public static final String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
    private Context ctx;
    @Override
    public IBinder onBind(Intent arg0) {
        ctx = getApplicationContext();
        return mBinder;
    }


    private class DownloadFile extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... _url) {
            Log.d(Constants.LOG_TAG, CLASS_NAME + " Start the background GetNewsTask \nURL :" + _url[0]);
            int count;
            File finalFile = new File(sdcardPath + Constants.APK_LOCAL_PATH + "/" + splitName(_url[0]));
            try {
                if (!finalFile.exists()) {
                    Log.i(Constants.LOG_TAG, CLASS_NAME + " Donwloading apk from the Web");
                    URL url = new URL(_url[0]);
                    URLConnection conexion = url.openConnection();
                    conexion.connect();
                    // this will be useful so that you can show a tipical 0-100%
                    // progress bar
                    int lenghtOfFile = conexion.getContentLength();
                    // downlod the file
                    InputStream input = new BufferedInputStream(url.openStream());
                    File dir = new File(sdcardPath + Constants.APK_LOCAL_PATH);
                    if (!dir.exists())
                        dir.mkdirs();
                    OutputStream output = new FileOutputStream(sdcardPath + Constants.APK_LOCAL_PATH + "/" + splitName(_url[0]));
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        // publishing the progress....
                        publishProgress((int) (total * 100 / lenghtOfFile));
                        output.write(data, 0, count);
                    }
                    output.flush();
                    output.close();
                    input.close();
                } else {
                    Log.i(Constants.LOG_TAG, CLASS_NAME + " Apk in SDcard");
                    publishProgress(100);
                }
            } catch (Exception e) {
            }

            return null;

        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            Intent i = new Intent();
            i.setAction(CUSTOM_INTENT);
            i.setFlags(progress[0]);
            ctx.sendBroadcast(i);
        }
    }

    private String splitName(String url) {
        String[] output = url.split("/");
        return output[output.length - 1];
    }

    public static final String CUSTOM_INTENT = "es.tempos21.sync.client.ProgressReceiver";

    private final IDownloadService.Stub mBinder = new IDownloadService.Stub() {

        public void downloadAsynFile(String url) throws DeadObjectException {
            try {
                DownloadFile d = new DownloadFile();
                d.execute(url);
            } catch (Exception e) {
                Log.e(Constants.LOG_TAG, CLASS_NAME + " " +e.getMessage());         }
        }


        }
};


interface IDownloadService {

    void downloadAsynFile(String url);    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Activity with ProgressBar -> Service -> AsyncTask 用于下载 - 但如何更新进度? 的相关文章

  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 获取 FTP 服务器上的文件大小并将其放在标签上

    我正在尝试获取托管在FTP服务器并将其放入Label而 BackgroundWorker 在后台工作 我在用着 Try 来获取该值 但是该值在第一次尝试时被捕获 下载后 如果我按尝试再次获取它 那么它就可以工作 Note 第一次尝试时进度条
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • 控制器:ctrlfmt 格式错误的控制器字符串“”。必须将 `__name__ 匹配为 __id__` 或 `__name__`

    在 rootes js 中 state main mydata url my data templateUrl app views pages my data html controller mydataCtrl 控制器 controlle
  • 如何关闭被杀死的程序打开的套接字?

    我有一个 Python 应用程序 它打开一个简单的 TCP 套接字来与单独主机上的另一个 Python 应用程序进行通信 有时程序要么出错 要么我直接杀死它 在任何一种情况下 套接字都可能会保持打开状态一段未知的时间 下次我去运行该程序时
  • 使用键/对表与 XML 字段和 XPath 的 SQL Server 性能对比

    我已经看到了关于这个主题的一些问题 但我正在寻找一些关于这个主题的见解性能差异这两种技术之间 例如 假设我正在记录事件日志 该日志将带有特定事件的键 值对的字典集进入系统 我将使用基本数据在事件表中记录一个条目 但随后我需要一种方法来链接其
  • Django 模板,如果项目 id 等于父循环名称,则循环遍历项目

    我正在尝试循环不同的区域 然后显示属于该区域的项目 Zone是一个模型 有一个名称和一个ForeignKey Planche 是一个以 Zone 作为外键的模型 我正在循环区域以显示每个区域 在该循环中 我循环所有 Planches 并且只
  • 如何初始化 struct sockaddr_in 的变量

    当我初始化变量时 我会执行以下操作 int i 0 char myText NULL 那么我该如何初始化struct sockaddr in类型变量 struct sockaddr in addr 如果您想将声明中的所有字段设置为零 无论结
  • 威尔逊评分区间的 Python 实现?

    看完之后如何不按平均评分排序 http www evanmiller org how not to sort by average rating html 我很好奇是否有人有伯努利参数的威尔逊得分置信区间下限的 Python 实现 Redd
  • Quill Editor:基于标签/类别的限制编辑

    我有一个场景 我想为用户提供一个半可编辑的模板 例如 p Name span class editable span p or div p Non editable content p h2 Some editable content h2
  • 如何在 Android 中扫描可用的广播电台?

    我们想要访问 Android 设备附近所有可用的无线电频率 有没有可用的 API 鉴于某些收音机在没有耳机 用作天线 的情况下无法启动 我们是否可以在不连接耳机的情况下扫描频率 我们想要访问 Android 设备附近可用的所有无线电频率 是
  • 无法在 NLB 上加载视图状态

    我们有一个系统 它可以动态创建每次回发的页面控件 并使用浏览器历史记录等处理回发 问题是 在生产服务器 NLB 上的 2 个节点 上 我们随机出现在不同的位置 没有发现任何相关性 加载视图状态失败 控制树可能是不同的错误 然而 我们的临时服
  • 在 Jenkins 中使用可编辑电子邮件扩展添加附件

    我正在 Jenkins 中使用可编辑电子邮件插件来附加电子邮件文件 问题是插件无法找到要附加的文件 我的文件结构是这样的 报告目录工作区 ReportDirectory 包含我要附加的报告 我相信插件的基本目录是工作区 所以我将附件位置指定
  • 是否应该始终将 role="contentinfo" 添加到页脚元素上?

    在 ARIA 演示网站上 role contentinfo 通常添加在footer元素 然而 现代网页设计中的页脚 http www smashingmagazine com 2008 04 08 footers in modern web
  • django中多参数过滤器和链式过滤器的区别

    django 中的多参数过滤器和链式过滤器有什么区别 正如您在生成的 SQL 语句中所看到的 差异并不是某些人可能怀疑的 OR 这就是 WHERE 和 JOIN 的放置方式 示例1 相同的连接表 来自https docs djangopro
  • 使用 Dapper 和 Postgresql - citext 数据类型

    我不确定是否有办法支持这一点 但我无法让 Dapper 将字符串参数值映射到 Postgresql citext 数据类型 因为它似乎使用的是文本类型 特别是 我试图调用一个接受 citext 参数的函数 我得到的错误是 var c Con
  • 无法使用 Springfox 发送授权承载令牌

    我无法理解为什么 Authorization Bearer 没有使用 Springfox 2 5 0 在我的 api 中发送 我有以下配置 private ApiKey apiKey return new ApiKey Authorizat
  • 如何在 C# 中获取音频/视频和捕获设备列表?

    在过去的两周里 我到处寻找 试图找到如何做到这一点的提示 这是我第一次提出请求 当我说我不喜欢寻求帮助时请相信我 但我已经束手无策了 我所能找到的就是如何在 C 中使用别人的框架列出可用的音频和视频设备 我想要做的就是列出从 C 中连接到计
  • 升级Eclipse java编译器

    我开始使用 Eclipse 附带的 Ant 令我烦恼的是 我收到了数百条警告 内容如下 javac 警告 java io BufferedInputStream class java io BufferedInputStream class
  • 在(不是*针对*)Android 设备上编程

    Android 平台上是否有适用于任何语言的解释器 如果是这样 它们可以同时使用物理键盘和屏幕键盘吗 我认为你可以使用 android 脚本引擎并在设备上使用 python 和其他语言 一篇文章 似乎证实了这一点 带有一个巨大的 编辑 按钮
  • 计算文本文件中的字母数

    我是一名Python初学者程序员 我正在尝试编写一个程序来计算文本文件中的字母数量 这是我到目前为止所得到的 import string text open text txt letters string ascii lowercase f
  • MVC BaseController 和 BaseModel 确保值可用于所有视图

    这是关于 Andre Calil 在以下 SO 中提供的解决方案的问题Razor MVC 在哪里放置可跨母版页 分区视图和视图访问的全局变量 https stackoverflow com questions 16986251 razor
  • Activity with ProgressBar -> Service -> AsyncTask 用于下载 - 但如何更新进度?

    这是当前的状态 情况 我有一个 Activity 绑定了一个 Service 该 Service 创建了下载各种 Web 资源的 AsyncTasks 这很好用 但是进度条当然什么也不显示 以前我有一个 Activity 创建了一个下载了一