在《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() &#