Android Handler实现文件下载教程

0 下载量 113 浏览量 更新于2024-08-29 收藏 100KB PDF 举报
"Android使用Handler实现下载文件功能" 在Android应用开发中,Handler是一个关键的组件,用于在主线程和工作线程之间传递消息。本文将介绍如何利用Handler来实现文件下载的功能。首先,我们需要在`AndroidManifest.xml`文件中声明必要的权限,包括访问互联网、读取外部存储和写入外部存储的权限。这些权限对于从网络下载文件并将其保存到手机存储是必不可少的。 ```xml <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 接下来,创建一个新的Android项目,例如名为`DownloadDemo`。在项目的布局文件`activity_main.xml`中,我们设计一个简单的用户界面,包含一个下载按钮和一个进度条,用于显示下载进度。 ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="下载"/> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> </LinearLayout> ``` 在`MainActivity`的Java代码中,我们创建一个内部类`DownloadThread`来执行实际的下载任务,同时使用Handler来更新UI。当用户点击“下载”按钮时,启动下载线程,并在下载过程中通过Handler发送消息到主线程,更新进度条。 ```java public class MainActivity extends AppCompatActivity { private Button downloadButton; private ProgressBar progressBar; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { int progress = msg.getData().getInt("progress"); progressBar.setProgress(progress); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); downloadButton = findViewById(R.id.button); progressBar = findViewById(R.id.progressBar); downloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new DownloadThread(handler).start(); } }); } // 下载线程 private class DownloadThread extends Thread { private Handler handler; public DownloadThread(Handler handler) { this.handler = handler; } @Override public void run() { try { URL url = new URL("http://example.com/file_to_download"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); int contentLength = connection.getContentLength(); InputStream inputStream = connection.getInputStream(); File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "downloaded_file.txt"); FileOutputStream outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; int bytesRead; int totalBytesRead = 0; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); totalBytesRead += bytesRead; int progress = (int) ((totalBytesRead * 100) / contentLength); Message message = new Message(); message.what = 1; Bundle bundle = new Bundle(); bundle.putInt("progress", progress); message.setData(bundle); handler.sendMessage(message); } outputStream.close(); inputStream.close(); // 下载完成后,可以在这里显示一些提示信息 Toast.makeText(MainActivity.this, "下载完成", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在`DownloadThread`的`run()`方法中,我们通过`HttpURLConnection`获取文件的输入流,并使用`FileOutputStream`将其写入本地文件。在每次读取一定数量的数据后,我们计算当前进度,并通过Handler发送一个包含该进度的消息到主线程。主线程的Handler接收到消息后,更新进度条的进度。 注意,这只是一个基础的下载示例,实际应用中可能需要处理更多复杂情况,如错误处理、断点续传、多线程下载等。此外,Android 6.0(API 级别 23)及以上版本需要在运行时动态请求`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限。在实际项目中,请确保正确处理这些权限请求。