Android模拟软件下载过程

在点击事件中,根据当前下载状态执行相应的操作。

具体的下载流程如下:

  1. 点击进度条时,会检查当前下载状态,如果没有完成下载,则进入相应的逻辑判断。
  2. 如果没有安装或等待中,则开始下载并显示进度条和进度文本。
  3. 如果已经在下载中,则暂停下载,并更新按钮文本为"继续"。
  4. 如果下载已经完成,显示提示信息。

在下载过程中,通过使用 Handler 定时更新进度条和进度文本,模拟下载进度的增加。当下载完成后,会有一个延迟操作来模拟安装过程,并显示相应的提示信息。

另外,点击"取消"按钮会重置所有下载状态,并将进度条和文本恢复到初始状态。

请注意,这只是一个简单的示例,并不包含真正的网络下载功能,而是通过随机数来模拟下载进度和延迟操作。你可以根据自己的需求进行修改和扩展。

下载(更新)逻辑

布局文件内容

<ProgressBar
        android:id="@+id/progressBar"
        style="@style/CustomProgressBarStyle"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="105dp"
        android:layout_marginBottom="402dp"
        android:max="100"
        android:min="0" />
?
    <TextView
        android:id="@+id/textView"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/progressBar"
        android:layout_alignTop="@+id/progressBar"
        android:layout_alignEnd="@+id/progressBar"
        android:layout_alignBottom="@+id/progressBar"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        android:gravity="center"
        android:text="下载"
        android:textColor="@color/black"
        android:textSize="20dp" />
?
    <ImageButton
        android:id="@+id/btn_cancel"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="417dp"
        android:layout_toEndOf="@+id/progressBar"
        android:visibility="invisible"
        android:background="@mipmap/cancel" />

下载逻辑部分

下载中操作

进度条变化设置
progressBar.setProgress(allProgress);
textView.setText(allProgress + "%");
btnCancel.setVisibility(View.VISIBLE);
handler.postDelayed(runnable, getRandomIndex());
下载过程中再次点击暂停
textView.setText("继续");
handler.removeCallbacks(runnable);
下载过程中点击取消
btnCancel.setOnClickListener(v -> {
    isDowning = false;
    installedSucceed = false;
    isInstalling = false;
    isWaiting = false;
    isFinishedDownloading = false;
    allProgress = 0;
    btnCancel.setVisibility(View.INVISIBLE);
    handler.removeCallbacks(runnable);
    progressBar.setProgress(0);
    textView.setText("下载");
});

下载完成操作

进入等待状态
progressBar.setProgress(0);
allProgress = 0;
btnCancel.setVisibility(View.INVISIBLE);
textView.setText("等待中");
isWaiting = true;
进入安装状态
textView.setText("安装中");
isWaiting = false;
isInstalling = true;

安装完成

if (installedSucceed) {
    textView.setText("打开");
    Toast.makeText(this, "xxx安装完成", Toast.LENGTH_SHORT).show();
    isFinishedDownloading = true;
} else {
    Toast.makeText(this, "xxx安装失败,请检查网络后重试", Toast.LENGTH_SHORT).show();
    textView.setText("重试");
    btnCancel.setVisibility(View.VISIBLE);
    isDowning = !isDowning;
}

其他

模拟下载进度
private int getRandomIndex() {
    Random random = new Random();
    return random.nextInt(1001) + 100;
}
?
private int getRandomProgress() {
    Random random = new Random();
    return random.nextInt(10) + 1;
}
全部代码
private void downLoading() {
    progressBar.setOnClickListener(v -> {
        Log.d(TAG, "downLoading: ");
        btnCancel.setVisibility(View.INVISIBLE);
        if (!isFinishedDownloading) {
            if (!isInstalling && !isWaiting) {
                textView.setText(allProgress + "%");
                if (!isDowning) {
                    runnable = () -> {
                        allProgress += getRandomProgress();
                        if (allProgress <= FINISHED) {
                            progressBar.setProgress(allProgress);
                            textView.setText(allProgress + "%");
                            btnCancel.setVisibility(View.VISIBLE);
                            handler.postDelayed(runnable, getRandomIndex());
                        } else {
                            progressBar.setProgress(0);
                            allProgress = 0;
                            btnCancel.setVisibility(View.INVISIBLE);
                            textView.setText("等待中");
                            isWaiting = true;
                            new Handler().postDelayed(() -> {
                                textView.setText("安装中");
                                isWaiting = false;
                                isInstalling = true;
                                new Handler().postDelayed(() -> {
                                    isInstalling = false;
                                    if (installedSucceed) {
                                        textView.setText("打开");
                                        Toast.makeText(this, "xxx安装完成", Toast.LENGTH_SHORT).show();
                                        isFinishedDownloading = true;
                                    } else {
                                        Toast.makeText(this, "xxx安装失败,请检查网络后重试", Toast.LENGTH_SHORT).show();
                                        textView.setText("重试");
                                        btnCancel.setVisibility(View.VISIBLE);
                                        isDowning = !isDowning;
                                    }
                                    installedSucceed = !installedSucceed;
                                }, 2000);
                            }, 3000);
                        }
                    };
                    handler.postDelayed(runnable, getRandomIndex());
                } else {
                    textView.setText("继续");
                    handler.removeCallbacks(runnable);
                }
                isDowning = !isDowning;
            }
        } else {
            Toast.makeText(this, "xxx安装完成", Toast.LENGTH_SHORT).show();
        }
    });
    btnCancel.setOnClickListener(v -> {
        isDowning = false;
        installedSucceed = false;
        isInstalling = false;
        isWaiting = false;
        isFinishedDownloading = false;
        allProgress = 0;
        btnCancel.setVisibility(View.INVISIBLE);
        handler.removeCallbacks(runnable);
        progressBar.setProgress(0);
        textView.setText("下载");
    });
}