我正在尝试编写一个可以更新的简单应用程序。为此,我需要一个简单的功能,可以下载文件并在 ProgressDialog
中 _显示当前进度_。我知道如何执行 ProgressDialog
,但我不确定如何显示当前进度以及如何首先下载文件。
原文由 Tom Leese 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试编写一个可以更新的简单应用程序。为此,我需要一个简单的功能,可以下载文件并在 ProgressDialog
中 _显示当前进度_。我知道如何执行 ProgressDialog
,但我不确定如何显示当前进度以及如何首先下载文件。
原文由 Tom Leese 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您要从互联网上下载东西,请不要忘记为您的清单文件添加权限!
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloandroid"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true">
</application>
</manifest>
原文由 Mnightmare 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
下载文件的方法有很多种。下面我将发布最常见的方式;由您决定哪种方法更适合您的应用程序。
AsyncTask
并在对话框中显示下载进度 ================================== ===========================此方法将允许您执行一些后台进程并同时更新 UI(在本例中,我们将更新进度条)。
进口:
这是一个示例代码:
AsyncTask
将如下所示:上面的方法 (
doInBackground
) 总是在后台线程上运行。您不应该在那里执行任何 UI 任务。另一方面,onProgressUpdate
和onPreExecute
在UI线程上运行,所以你可以改变进度条:要运行它,您需要 WAKE_LOCK 权限。
这里的大问题是: 如何从服务更新我的活动? .在下一个示例中,我们将使用两个您可能不知道的类:
ResultReceiver
和IntentService
。ResultReceiver
允许我们从服务更新我们的线程;IntentService
是 --- 的子类Service
它产生一个线程从那里做后台工作(你应该知道Service
实际上运行在你的同一个线程-cd214 ; 当您扩展Service
时,您必须手动生成新线程以运行 CPU 阻塞操作)。下载服务可能如下所示:
将服务添加到您的清单中:
活动将如下所示:
这是
ResultReceiver
来玩:2.1 使用Groundy库
Groundy 是一个基本上可以帮助您在后台服务中运行代码片段的库,它基于
ResultReceiver
上面显示的概念。该库目前已被 弃用。这就是 整个 代码的样子:您显示对话框的活动…
Groundy 用于下载文件并显示进度的
GroundyTask
实现:并将其添加到清单中:
我想再简单不过了。只需 从 Github 获取最新的 jar,就可以开始了。请记住, Groundy 的主要目的是在后台服务中调用外部 REST api,并轻松地将结果发布到 UI。如果你在你的应用程序中做类似的事情,它可能真的很有用。
2.2 使用 https://github.com/koush/ion
DownloadManager
类(GingerBread
和更新版本)============================= ================================GingerBread 带来了一个新功能,
DownloadManager
,它允许您轻松下载文件并将处理线程、流等的繁重工作委托给系统。首先,让我们看一个实用方法:
方法的名称说明了一切。一旦确定
DownloadManager
可用,您可以执行以下操作:下载进度将显示在通知栏中。
最后的想法
第一种和第二种方法只是冰山一角。如果您希望您的应用程序健壮,则必须记住很多事情。这是一个简短的列表:
INTERNET
和WRITE_EXTERNAL_STORAGE
);还有ACCESS_NETWORK_STATE
如果你想检查互联网可用性。除非您需要对下载过程进行详细控制,否则请考虑使用
DownloadManager
(3) 因为它已经处理了上面列出的大部分项目。但也要考虑到您的需求可能会发生变化。例如,
DownloadManager
没有响应缓存。它会盲目地多次下载同一个大文件。事后没有简单的方法可以修复它。如果您从基本的HttpURLConnection
(1, 2) 开始,那么您只需添加一个HttpResponseCache
。因此,学习基本的标准工具的初步努力可能是一项很好的投资。