Android基于IIS的APK下载(四)数据下载

本文介绍了在Android应用中如何实现基于IIS的APK异步下载。通过JSON获取更新数据后,利用多线程进行下载,每个下载任务在独立线程中进行,使用Handler更新下载进度。当下载行为为INSTALL时,调用InstallApk方法进行安装。同时,文章讨论了线程管理和安全问题,包括在Adapter finalize方法中关闭下载线程,以及AbortAsyncDownload方法根据线程名结束下载。
摘要由CSDN通过智能技术生成

在《Android基于IIS的APK下载(三)用JSON传输更新数据》一文中已经从服务器中拿到了更新数据,并且呈现到了UI中,结合前面的文章及效果图(参见下图),可以看到UI中的更新列表一行一行的呈现,而每一行的末尾有一个行为按钮,对应着不同的行为,这个行为要如何实现呢?

我们再看一下UpdateItemsAdapter中getView的部分代码

updateItem.SetBehavior(isNewVersion ? UPDATE_BEHAVIORS.UPDATE
				: UPDATE_BEHAVIORS.NO_UPDATE);

		behavior_button.setEnabled(isNewVersion);
		behavior_button.setText(updateItem.GetBehavior());
		behavior_button.setTag(updateItem);

		behavior_button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				ExecuteBehavior(behavior_button);
			}
		});

代码中可以看到,updateItem有设置行为的动作,而这个行为是根据是否有新版本来设置的。之后该行为会呈现到behavior_button中,并且将updateItem设置到behavior_button的tag中,还设置了单击事件,事件里面调用ExecuteBehavior(behavior_button),下面是这个函数的实现代码。

private void ExecuteBehavior(final Button behavior_button) {
		try {

			UpdateItem updateItem = (UpdateItem) behavior_button.getTag();
			if (updateItem == null) {
				return;
			}

			if (updateItem.GetBehavior() == UPDATE_BEHAVIORS.INSTALL) {
				if (updateItem.GetSavePath() == null
						|| updateItem.GetSavePath().length() <= 0) {
					return;
				}
				InstallApk(updateItem.GetSavePath());
				return;
			} else if (updateItem.GetBehavior() == UPDATE_BEHAVIORS.NO_UPDATE) {
				return;
			}

			final String url = updateItem.GetUrl();
			final String savePath = FetchSavePath(url);
			
			final Handler downloadHandler =InitDownloadHandler(behavior_button);

			String aysncDownloadThreadName = RequestSp.DownLoadFileAsync(url, savePath, downloadHandler);
			if (aysncDownloadThreadName != null
					&& aysncDownloadThreadName.length() > 0) {
				_aysncDownloadThreadNames.add(aysncDownloadThreadName);
			}

		} catch (Exception e) {
			behavior_button.setEnabled(true);
		}
	}

	private Handler InitDownloadHandler(final Button behavior_button)
	{
		Handler _downloadHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				UpdateItem updateItem = (UpdateItem) behavior_button
						.getTag();
				switch (msg.what) {
				case REQUEST_MESSAGES.DOWNLOAD_START: {
					behavior_button.setEnabled(false);
					break;
				}
				case REQUEST_MESSAGES.DOWNLOAD_PERCENT: {
					Bundle bundle = msg.getData();
					float downloadPercent = bundle
							.getFloat(REQUEST_KEYS.DOWNLOAD_PERCENT);
					behavior_button.setText(String.format("%1$.2f",
							downloadPercent) + "%");
					break;
				}
				case REQUEST_MESSAGES.DOWNLOAD_COMPLETED: {
					Bundle bundle = msg.getData();
					String savePath = bundle
							.getString(REQUEST_KEYS.DOWNLOAD_SAVE_PATH);
					behavior_button.setEnabled(true);
					behavior_button
							.setText(UPDATE_BEHAVIORS.INSTALL);
					if (updateItem != null) {
						updateItem.SetBehavior(UPDATE_BEHAVIORS.INSTALL);
						updateItem.SetSavePath(savePath);
					}
					break;
				}
				case REQUEST_MESSAGES.DOWNLOAD_EXCEPTION: {
					behavior_button.setEnabled(true);
					String info = "Download " + updateItem.GetUrl() &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值