Android - app应用下载(进度条显示)

效果如下图:


进度条下载.gif

布局 文件

  • activity_main.xml



    

UI 文件

  • HomeActivity.java
public class HomeActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "HomeActivity";
    /**
     * 下载
     */
    private Button mBtn;
    private ProgressBar mPgb;
    private TextView mTv;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        initView();

    }


    private void initView() {
        mBtn = (Button) findViewById(R.id.btn);
        mBtn.setOnClickListener(this);
        mPgb = (ProgressBar) findViewById(R.id.pgb);
        mTv = (TextView) findViewById(R.id.tv);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.btn:
                initDownload();
                break;
        }
    }

    private void initDownload() {

        OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

        Request request = new Request.Builder()
                .url("http://cdn.banmi.com/banmiapp/apk/banmi_330.apk")
                .get()
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("tag", "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ResponseBody body = response.body();        // 获取到请求体
                InputStream inputStream = body.byteStream();    // 转换成字节流
                saveFile(inputStream, Environment.getExternalStorageDirectory() + "/" + "qq.apk", body.contentLength());
            }
        });

    }


    /**
     * @param inputStream
     * @param s           存放的地址
     * @param l           文件的长度
     */
    private void saveFile(InputStream inputStream, String s, final long l) {
        long count = 0;
        try {
            // 获取到输出流,写入到的地址
            FileOutputStream outputStream = new FileOutputStream(new File(s));
            int length = -1;
            byte[] bytes = new byte[1024 * 10];
            while ((length = inputStream.read(bytes)) != -1) {
                // 写入文件
                outputStream.write(bytes, 0, length);
                count += length;

                final long finalCount = count;
                final int finalLenght = length;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mPgb.setMax((int) l);       // 设置进度条最大值
                        mPgb.setProgress((int) finalCount);     // 设置进度
                        mTv.setText((int) (100 * finalCount / l) + "%");  // 设置进度文本 (100 * 当前进度 / 总进度)
                    }
                });
                Log.e("tag", "progress" + count + "max" + l);
            }
            inputStream.close();        // 关闭输入流
            outputStream.close();       // 关闭输出流
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 如果写入的进度值完毕,Toast
                    Toast.makeText(HomeActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(Android - app应用下载(进度条显示))