GooglePlayNotes Day06

#Day06 #

#下载模块布局 ##

// 初始化下载布局

FrameLayout flDetailDownload = (FrameLayout) view

		.findViewById(R.id.fl_detail_downlod);

DetailDownloadHolder downloadHolder = new DetailDownloadHolder();

flDetailDownload.addView(downloadHolder.getRootView());



----------------------------



<FrameLayout

    android:id="@+id/fl_detail_downlod"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:background="@drawable/detail_bottom_bg" >

</FrameLayout>



----------------------------

layout_detail_download.xml



<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >



    <Button

        android:id="@+id/btn_fav"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_margin="2dp"

        android:background="@drawable/detail_btn_normal"

        android:text="收藏"

        android:textColor="#fff" />



    <Button

        android:id="@+id/btn_share"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentRight="true"

        android:layout_margin="2dp"

        android:background="@drawable/detail_btn_normal"

        android:text="分享"

        android:textColor="#fff" />



    <Button

		android:id="@+id/btn_download"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_margin="2dp"

        android:layout_toLeftOf="@id/btn_share"

        android:layout_toRightOf="@id/btn_fav"

        android:background="@drawable/progress_btn_normal"

        android:text="下载"

        android:textColor="#fff" />



</RelativeLayout>

线程池封装 ##

/**
  • 线程管理器
     *

  • @author Kevin
     */
     public class ThreadManager {

      private static ThreadPool mThreadPool;
    
    
    
      // 获取单例的线程池对象
    
      public static ThreadPool getThreadPool() {
    
      	if (mThreadPool == null) {
    
      		synchronized (ThreadManager.class) {
    
      			if (mThreadPool == null) {
    
      				int cpuNum = Runtime.getRuntime().availableProcessors();// 获取处理器数量
    
      				int threadNum = cpuNum * 2 + 1;// 根据cpu数量,计算出合理的线程并发数
    
      				System.out.println("cpu num:" + cpuNum);
    
      				mThreadPool = new ThreadPool(threadNum, threadNum, 0L);
    
      			}
    
      		}
    
      	}
    
    
    
      	return mThreadPool;
    
      }
    
    
    
      public static class ThreadPool {
    
    
    
      	private ThreadPoolExecutor mExecutor;
    
    
    
      	private int corePoolSize;
    
      	private int maximumPoolSize;
    
      	private long keepAliveTime;
    
    
    
      	private ThreadPool(int corePoolSize, int maximumPoolSize,
    
      			long keepAliveTime) {
    
      		this.corePoolSize = corePoolSize;
    
      		this.maximumPoolSize = maximumPoolSize;
    
      		this.keepAliveTime = keepAliveTime;
    
      	}
    
    
    
      	public void execute(Runnable runnable) {
    
      		if (runnable == null) {
    
      			return;
    
      		}
    
    
    
      		// 线程池几个参数的理解:
    
      		// 比如去火车站买票, 有10个售票窗口, 但只有5个窗口对外开放. 那么对外开放的5个窗口称为核心线程数,
    
      		// 而最大线程数是10个窗口.
    
      		// 如果5个窗口都被占用, 那么后来的人就必须在后面排队, 但后来售票厅人越来越多, 已经人满为患, 就类似于线程队列已满.
    
      		// 这时候火车站站长下令, 把剩下的5个窗口也打开, 也就是目前已经有10个窗口同时运行. 后来又来了一批人,
    
      		// 10个窗口也处理不过来了, 而且售票厅人已经满了, 这时候站长就下令封锁入口,不允许其他人再进来, 这就是线程异常处理策略.
    
      		// 而线程存活时间指的是, 允许售票员休息的最长时间, 以此限制售票员偷懒的行为.
    
      		if (mExecutor == null) {
    
      			mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心线程数
    
      					maximumPoolSize, // 最大线程数
    
      					keepAliveTime, // 闲置线程存活时间
    
      					TimeUnit.MILLISECONDS,// 时间单位
    
      					new LinkedBlockingDeque<Runnable>(),// 线程队列
    
      					Executors.defaultThreadFactory(),// 线程工厂
    
      					new AbortPolicy()// 队列已满,而且当前线程数已经超过最大线程数时的异常处理策略
    
      			);
    
      		}
    
    
    
      		mExecutor.execute(runnable);
    
      	}
    
      }
    

    }

使用线程池改造异步网络请求

LoadingPage

	// 异步加载网络数据

	ThreadManager.getThreadPool().execute(new Runnable() {



		@Override

		public void run() {

			// 开始加载网络数据

			final ResultState state = onLoad();

			// 必须在主线程更新界面

			UIUtils.runOnUiThread(new Runnable() {



				@Override

				public void run() {

					if (state != null) {

						// 更新当前状态

						mCurrentState = state.getState();

						// 更新当前页面

						showRightPage();

					}

				}

			});

		}

	});

MyBaseAdapter

	/**
  • 加载更多数据
     */
     public void loadMore(final MoreHolder holder) {
     ThreadManager.getThreadPool().execute(new Runnable() {

      		@Override
    
      		public void run() {
    
      			// 获取更多数据
    
      			final ArrayList<T> moreList = onLoadMore();
    
    
    
      			UIUtils.runOnUiThread(new Runnable() {
    
    
    
      				@Override
    
      				public void run() {
    
      					if (moreList == null) {// 如果没有拿到数据,说明加载失败
    
      						holder.setData(MoreHolder.TYPE_LOAD_ERROR);
    
      					} else {
    
      						// 每页返回20条数据,如果发现获取数据小于20条,说明已经没有更多数据了
    
      						if (moreList.size() < 20) {
    
      							holder.setData(MoreHolder.TYPE_NO_MORE);
    
      						} else {
    
      							holder.setData(MoreHolder.TYPE_HAS_MORE);
    
      						}
    
    
    
      						// 将下一页的数据追加到当前集合当中
    
      						list.addAll(moreList);
    
      						// 刷新当前listview
    
      						notifyDataSetChanged();
    
      					}
    
      				}
    
      			});
    
    
    
      		}
    
      	});
    
      }
    

下载状态分析 ##

下载未开始
等待下载
正在下载
下载暂停
下载失败
下载成功

	public static final int STATE_NONE = 0;// 下载未开始

	public static final int STATE_WAITING = 1;// 等待下载

	public static final int STATE_DOWNLOAD = 2;// 正在下载

	public static final int STATE_PAUSE = 3;// 下载暂停

	public static final int STATE_ERROR = 4;// 下载失败

	public static final int STATE_SUCCESS = 5;// 下载成功

观察者模式 ##

/**
  • 下载管理器-单例
     *

  • @author Kevin
     */
     public class DownloadManager {

      public static final int STATE_NONE = 0;// 下载未开始
    
      public static final int STATE_WAITING = 1;// 等待下载
    
      public static final int STATE_DOWNLOAD = 2;// 正在下载
    
      public static final int STATE_PAUSE = 3;// 下载暂停
    
      public static final int STATE_ERROR = 4;// 下载失败
    
      public static final int STATE_SUCCESS = 5;// 下载成功
    
    
    
      private ArrayList<DownloadObserver> mObservers = new ArrayList<DownloadObserver>();
    
    
    
      private static DownloadManager sInstance = new DownloadManager();
    
    
    
      private DownloadManager() {
    
      }
    
    
    
      public static DownloadManager getInstance() {
    
      	return sInstance;
    
      }
    
    
    
      // 2. 注册观察者
    
      public void registerObserver(DownloadObserver observer) {
    
      	if (observer != null && !mObservers.contains(observer)) {
    
      		mObservers.add(observer);
    
      	}
    
      }
    
    
    
      // 3. 注销观察者
    
      public void unregisterObserver(DownloadObserver observer) {
    
      	if (observer != null && mObservers.contains(observer)) {
    
      		mObservers.remove(observer);
    
      	}
    
      }
    
    
    
      // 4. 通知下载状态变化
    
      public void notifyDownloadStateChanged() {
    
      	for (DownloadObserver observer : mObservers) {
    
      		observer.onDownloadStateChanged();
    
      	}
    
      }
    
    
    
      // 5. 通知下载进度变化
    
      public void notifyDownloadProgressChanged() {
    
      	for (DownloadObserver observer : mObservers) {
    
      		observer.onDownloadProgressChanged();
    
      	}
    
      }
    
    
    
      /**
    
    1. 定义下载观察者接口
       */
       public interface DownloadObserver {
       // 下载状态发生变化
       public void onDownloadStateChanged();

         // 下载进度发生变化
      
         public void onDownloadProgressChanged();
      

      }

    }

下载对象封装 ##

/**
  • 下载对象封装
     *

  • @author Kevin
     */
     public class DownloadInfo {

      public String id;// apk唯一标识
    
      public long size;// apk大小
    
      public String downloadUrl;// 下载链接
    
      public String name;// apk名称
    
      public int currentState;// 当前下载状态
    
      public long currentPos;// 当前下载位置
    
      public String path;// apk下载在本地的路径
    
    
    
      private static final String GOOGLEMARKET = "googlemarket";// 文件夹名称
    
      private static final String DOWNLOAD = "download";// 子文件夹名称
    
    
    
      // 获取当前下载进度
    
      public float getProgress() {
    
      	if (size == 0) {
    
      		return 0;
    
      	}
    
    
    
      	return (float) currentPos / size;
    
      }
    
    
    
      /**
    
  • 根据应用信息,拷贝出一个下载对象
     */
     public static DownloadInfo copy(AppInfo appInfo) {
     DownloadInfo info = new DownloadInfo();
     info.id = appInfo.id;
     info.size = appInfo.size;
     info.downloadUrl = appInfo.downloadUrl;
     info.name = appInfo.name;
     info.currentState = DownloadManager.STATE_NONE;
     info.currentPos = 0;
     info.path = getFilePath(info.name);

      	return info;
    
      }
    
    
    
      /**
    
  • 获取apk文件的本地下载路径
     */
     private static String getFilePath(String name) {
     StringBuffer sb = new StringBuffer();
     String sdcardPath = Environment.getExternalStorageDirectory()
     .getAbsolutePath();
     sb.append(sdcardPath);
     sb.append(File.separator);
     sb.append(GOOGLEMARKET);
     sb.append(File.separator);
     sb.append(DOWNLOAD);

      	if (createDir(sb.toString())) {
    
      		return sb.toString() + File.separator + name + ".apk";
    
      	}
    
    
    
      	return null;
    
      }
    
    
    
      // 创建文件夹
    
      private static boolean createDir(String dirPath) {
    
      	File dirFile = new File(dirPath);
    
      	if (!dirFile.exists() || !dirFile.isDirectory()) {
    
      		// 如果文件夹不存在,或者此文件不是一个文件夹,需要创建文件夹
    
      		return dirFile.mkdirs();
    
      	}
    
    
    
      	return true;// 文件夹已经存在
    
      }
    

    }

开始下载 ##

/**
  • 下载对象封装
     *

  • @author Kevin
     */
     public class DownloadInfo {

      public String id;// apk唯一标识
    
      public long size;// apk大小
    
      public String downloadUrl;// 下载链接
    
      public String name;// apk名称
    
      public int currentState;// 当前下载状态
    
      public long currentPos;// 当前下载位置
    
      public String path;// apk下载在本地的路径
    
    
    
      private static final String GOOGLEMARKET = "googlemarket";// 文件夹名称
    
      private static final String DOWNLOAD = "download";// 子文件夹名称
    
    
    
      // 获取当前下载进度
    
      public float getProgress() {
    
      	if (size == 0) {
    
      		return 0;
    
      	}
    
    
    
      	return (float) currentPos / size;
    
      }
    
    
    
      /**
    
  • 根据应用信息,拷贝出一个下载对象
     */
     public static DownloadInfo copy(AppInfo appInfo) {
     DownloadInfo info = new DownloadInfo();
     info.id = appInfo.id;
     info.size = appInfo.size;
     info.downloadUrl = appInfo.downloadUrl;
     info.name = appInfo.name;
     info.currentState = DownloadManager.STATE_NONE;
     info.currentPos = 0;
     info.path = getFilePath(info.name);

      	return info;
    
      }
    
    
    
      /**
    
  • 获取apk文件的本地下载路径
     */
     private static String getFilePath(String name) {
     StringBuffer sb = new StringBuffer();
     String sdcardPath = Environment.getExternalStorageDirectory()
     .getAbsolutePath();
     sb.append(sdcardPath);
     sb.append(File.separator);
     sb.append(GOOGLEMARKET);
     sb.append(File.separator);
     sb.append(DOWNLOAD);

      	if (createDir(sb.toString())) {
    
      		return sb.toString() + File.separator + name + ".apk";
    
      	}
    
    
    
      	return null;
    
      }
    
    
    
      // 创建文件夹
    
      private static boolean createDir(String dirPath) {
    
      	File dirFile = new File(dirPath);
    
      	if (!dirFile.exists() || !dirFile.isDirectory()) {
    
      		// 如果文件夹不存在,或者此文件不是一个文件夹,需要创建文件夹
    
      		return dirFile.mkdirs();
    
      	}
    
    
    
      	return true;// 文件夹已经存在
    
      }
    

    }

下载暂停 ##

/**
  • 下载暂停
     */
     public synchronized void pause(AppInfo appInfo) {
     if (appInfo != null) {
     DownloadInfo downloadInfo = mDownloadInfoMap.get(appInfo.id);
     if (downloadInfo != null) {
     int state = downloadInfo.currentState;
     // 如果当前状态是等待下载或者正在下载, 需要暂停当前任务
     if (state == STATE_WAITING || state == STATE_DOWNLOAD) {
     // 停止当前的下载任务
     DownloadTask downloadTask = mDownloadTaskMap
     .get(appInfo.id);
     if (downloadTask != null) {
     ThreadManager.getThreadPool().cancel(downloadTask);
     }

      			// 更新下载状态为暂停
    
      			downloadInfo.currentState = STATE_PAUSE;
    
      			notifyDownloadStateChanged(downloadInfo);
    
      		}
    
      	}
    
      }
    

    }

安装 ##

/**
  • 安装apk
     */
     public synchronized void install(AppInfo appInfo) {
     DownloadInfo downloadInfo = mDownloadInfoMap.get(appInfo.id);
     if (downloadInfo != null) {
     // 跳到系统的安装页面进行安装
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.setDataAndType(Uri.parse(“file://” + downloadInfo.path),
     “application/vnd.android.package-archive”);
     UIUtils.getContext().startActivity(intent);
     }
     }

下载过程 ##

/**
  • 下载任务
     */
     class DownloadTask implements Runnable {

      private DownloadInfo downloadInfo;
    
      private HttpResult httpResult;
    
    
    
      public DownloadTask(DownloadInfo downloadInfo) {
    
      	this.downloadInfo = downloadInfo;
    
      }
    
    
    
      @Override
    
      public void run() {
    
      	// 更新下载状态
    
      	downloadInfo.currentState = STATE_DOWNLOAD;
    
      	notifyDownloadStateChanged(downloadInfo);
    
    
    
      	File file = new File(downloadInfo.path);
    
      	if (!file.exists() || file.length() != downloadInfo.currentPos
    
      			|| downloadInfo.currentPos == 0) {// 文件不存在, 或者文件长度和对象的长度不一致,
    
      												// 或者对象当前下载位置是0
    
      		file.delete();// 移除无效文件
    
      		downloadInfo.currentPos = 0;// 文件当前位置归零
    
      		httpResult = HttpHelper.download(HttpHelper.URL
    

“download?name=” + downloadInfo.downloadUrl);// 从头开始下载文件
 } else {
 // 需要断点续传
 httpResult = HttpHelper.download(HttpHelper.URL
“download?name=” + downloadInfo.downloadUrl
“&range=” + file.length());
 }

		InputStream in = null;

		FileOutputStream out = null;

		if (httpResult != null

				&& (in = httpResult.getInputStream()) != null) {

			try {

				out = new FileOutputStream(file, true);//在源文件基础上追加



				int len = 0;

				byte[] buffer = new byte[1024];

				while ((len = in.read(buffer)) != -1

						&& downloadInfo.currentState == STATE_DOWNLOAD) {// 只有在下载的状态才读取文件,如果状态变化,就立即停止读写文件

					out.write(buffer, 0, len);

					out.flush();



					downloadInfo.currentPos += len;// 更新当前文件下载位置

					notifyDownloadProgressChanged(downloadInfo);// 通知进度更新

				}

			} catch (Exception e) {

				e.printStackTrace();

			} finally {

				IOUtils.close(in);

				IOUtils.close(out);

			}



			// 下载结束, 判断文件是否完整

			if (file.length() == downloadInfo.size) {

				// 下载完毕

				downloadInfo.currentState = STATE_SUCCESS;

				notifyDownloadStateChanged(downloadInfo);

			} else if (downloadInfo.currentState == STATE_PAUSE) {

				// 中途暂停

				notifyDownloadStateChanged(downloadInfo);

			} else {

				// 下载失败

				downloadInfo.currentState = STATE_ERROR;

				downloadInfo.currentPos = 0;

				notifyDownloadStateChanged(downloadInfo);

				// 删除无效文件

				file.delete();

			}



		} else {

			// 下载失败

			downloadInfo.currentState = STATE_ERROR;

			downloadInfo.currentPos = 0;

			notifyDownloadStateChanged(downloadInfo);

			// 删除无效文件

			file.delete();

		}



		// 不管下载成功,失败还是暂停, 下载任务已经结束,都需要从当前任务集合中移除

		mDownloadTaskMap.remove(downloadInfo.id);

	}



}

应用详情页下载状态更新 ##

初始化自定义进度条

	// 添加进度条布局

	pbProgress = new ProgressHorizontal(UIUtils.getContext());

	pbProgress.setProgressTextColor(Color.WHITE);// 文字颜色为白色

	pbProgress.setProgressTextSize(UIUtils.dip2px(18));// 文字大小

	pbProgress.setProgressResource(R.drawable.progress_normal);// 进度条颜色

	pbProgress.setProgressBackgroundResource(R.drawable.progress_bg);// 进度条背景色

	// 初始化布局参数

	FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(

			FrameLayout.LayoutParams.MATCH_PARENT,

			FrameLayout.LayoutParams.MATCH_PARENT);



	flDownload.addView(pbProgress, params);

初始化下载状态

	@Override

	public void refreshView(AppInfo data) {

		mAppInfo = data;



		mDownloadManager = DownloadManager.getInstance();

		// 监听下载进度

		mDownloadManager.registerObserver(this);



		DownloadInfo downloadInfo = mDownloadManager.getDownloadInfo(data);

		if (downloadInfo == null) {

			// 没有下载过

			mCurrentState = DownloadManager.STATE_NONE;

			mProgress = 0;

		} else {

			// 之前下载过, 以内存中的对象的状态为准

			mCurrentState = downloadInfo.currentState;

			mProgress = downloadInfo.getProgress();

		}



		//根据对象状态刷新界面

		refreshUI(mProgress, mCurrentState);

	}

根据下载状态刷新界面

	/**
  • 刷新界面
     */
     private void refreshUI(float progress, int state) {
     mCurrentState = state;
     mProgress = progress;
     switch (state) {
     case DownloadManager.STATE_NONE:
     flDownload.setVisibility(View.GONE);
     btnDownload.setText(UIUtils.getString(R.string.app_state_download));
     break;
     case DownloadManager.STATE_WAITING:
     flDownload.setVisibility(View.GONE);
     btnDownload.setText(UIUtils.getString(R.string.app_state_waiting));
     break;
     case DownloadManager.STATE_DOWNLOAD:
     flDownload.setVisibility(View.VISIBLE);
     pbProgress.setProgress(progress);
     pbProgress.setCenterText("");
     break;
     case DownloadManager.STATE_PAUSE:
     flDownload.setVisibility(View.VISIBLE);
     pbProgress.setCenterText(UIUtils
     .getString(R.string.app_state_paused));
     break;
     case DownloadManager.STATE_ERROR:
     flDownload.setVisibility(View.GONE);
     btnDownload.setText(UIUtils.getString(R.string.app_state_error));
     break;
     case DownloadManager.STATE_SUCCESS:
     flDownload.setVisibility(View.GONE);
     btnDownload.setText(UIUtils
     .getString(R.string.app_state_downloaded));
     break;

      	default:
    
      		break;
    
      	}
    
      }
    

监听下载状态和进度变化

	@Override

	public void onDownloadStateChanged(DownloadInfo info) {

		refreshOnMainThread(info);

	}



	@Override

	public void onDownloadProgressChanged(DownloadInfo info) {

		refreshOnMainThread(info);

	}



	// 主线程刷新ui

	private void refreshOnMainThread(final DownloadInfo info) {

		// 判断要刷新的下载对象是否是当前的应用

		if (info.id.equals(mAppInfo.id)) {

			UIUtils.runOnUiThread(new Runnable() {



				@Override

				public void run() {

					refreshUI(info.getProgress(), info.currentState);

				}

			});

		}

	}

下载按钮事件处理

	@Override

	public void onClick(View v) {

		switch (v.getId()) {

		case R.id.btn_download:

		case R.id.fl_download:

			// 根据当前状态来决定相关操作

			if (mCurrentState == DownloadManager.STATE_NONE

					|| mCurrentState == DownloadManager.STATE_PAUSE

					|| mCurrentState == DownloadManager.STATE_ERROR) {

				// 开始下载

				mDownloadManager.download(mAppInfo);

			} else if (mCurrentState == DownloadManager.STATE_DOWNLOAD

					|| mCurrentState == DownloadManager.STATE_WAITING) {

				// 暂停下载

				mDownloadManager.pause(mAppInfo);

			} else if (mCurrentState == DownloadManager.STATE_SUCCESS) {

				// 开始安装

				mDownloadManager.install(mAppInfo);

			}

			break;



		default:

			break;

		}

	}

首页下载状态更新 #

和应用详情页逻辑基本一致

初始化圆形自定义进度条

	//初始化圆形进度条

	pbProgress = new ProgressArc(UIUtils.getContext());

	//设置圆形进度条直径

	pbProgress.setArcDiameter(UIUtils.dip2px(26));

	//设置进度条颜色

	pbProgress.setProgressColor(UIUtils.getColor(R.color.progress));

	//设置进度条宽高布局参数

	FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(

			UIUtils.dip2px(27), UIUtils.dip2px(27));

	flDownload.addView(pbProgress, params);



	flDownload.setOnClickListener(this);

初始化下载状态

	mDownloadManager = DownloadManager.getInstance();

	// 监听下载进度

	mDownloadManager.registerObserver(this);



	DownloadInfo downloadInfo = mDownloadManager.getDownloadInfo(data);

	if (downloadInfo == null) {

		// 没有下载过

		mCurrentState = DownloadManager.STATE_NONE;

		mProgress = 0;

	} else {

		// 之前下载过, 以内存中的对象的状态为准

		mCurrentState = downloadInfo.currentState;

		mProgress = downloadInfo.getProgress();

	}



	refreshUI(mProgress, mCurrentState);

根据下载状态刷新界面

	/**
  • 刷新界面
     *

  • @param progress

  • @param state
     */
     private void refreshUI(float progress, int state) {
     mCurrentState = state;
     mProgress = progress;
     switch (state) {
     case DownloadManager.STATE_NONE:
     pbProgress.setBackgroundResource(R.drawable.ic_download);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
     tvDownload.setText(UIUtils.getString(R.string.app_state_download));
     break;
     case DownloadManager.STATE_WAITING:
     pbProgress.setBackgroundResource(R.drawable.ic_download);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_WAITING);
     tvDownload.setText(UIUtils.getString(R.string.app_state_waiting));
     break;
     case DownloadManager.STATE_DOWNLOAD:
     pbProgress.setBackgroundResource(R.drawable.ic_pause);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_DOWNLOADING);
     pbProgress.setProgress(progress, true);
     tvDownload.setText((int) (progress * 100) + “%”);
     break;
     case DownloadManager.STATE_PAUSE:
     pbProgress.setBackgroundResource(R.drawable.ic_resume);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
     flDownload.setVisibility(View.VISIBLE);
     break;
     case DownloadManager.STATE_ERROR:
     pbProgress.setBackgroundResource(R.drawable.ic_redownload);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
     tvDownload.setText(UIUtils.getString(R.string.app_state_error));
     break;
     case DownloadManager.STATE_SUCCESS:
     pbProgress.setBackgroundResource(R.drawable.ic_install);
     pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
     tvDownload
     .setText(UIUtils.getString(R.string.app_state_downloaded));
     break;

      	default:
    
      		break;
    
      	}
    
      }
    

监听下载状态和进度变化

	@Override

	public void onDownloadStateChanged(DownloadInfo info) {

		refreshOnMainThread(info);

	}



	@Override

	public void onDownloadProgressChanged(DownloadInfo info) {

		refreshOnMainThread(info);

	}



	// 主线程刷新ui

	private void refreshOnMainThread(final DownloadInfo info) {

		// 判断要刷新的下载对象是否是当前的应用

		if (info.id.equals(mAppInfo.id)) {

			UIUtils.runOnUiThread(new Runnable() {



				@Override

				public void run() {

					refreshUI(info.getProgress(), info.currentState);

				}

			});

		}

	}

下载按钮事件处理

	@Override

	public void onClick(View v) {

		switch (v.getId()) {

		case R.id.fl_download:

			// 根据当前状态来决定相关操作

			if (mCurrentState == DownloadManager.STATE_NONE

					|| mCurrentState == DownloadManager.STATE_PAUSE

					|| mCurrentState == DownloadManager.STATE_ERROR) {

				// 开始下载

				mDownloadManager.download(mAppInfo);

			} else if (mCurrentState == DownloadManager.STATE_DOWNLOAD

					|| mCurrentState == DownloadManager.STATE_WAITING) {

				// 暂停下载

				mDownloadManager.pause(mAppInfo);

			} else if (mCurrentState == DownloadManager.STATE_SUCCESS) {

				// 开始安装

				mDownloadManager.install(mAppInfo);

			}

			break;



		default:

			break;

		}

	}

ActionBar简介 ##

DrawerLayout

	<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"

	    android:id="@+id/drawerlayout"

	    android:layout_width="match_parent"

	    android:layout_height="match_parent" >

	

	    <LinearLayout

	        android:layout_width="match_parent"

	        android:layout_height="match_parent"

	        android:orientation="vertical" >

	

	        <com.itcast.googleplayteach.ui.PagerTab

	            android:id="@+id/pager_tab"

	            android:layout_width="match_parent"

	            android:layout_height="42dp"

	            android:background="@drawable/bg_tab" />

	

	        <android.support.v4.view.ViewPager

	            android:id="@+id/vp_pager"

	            android:layout_width="match_parent"

	            android:layout_height="match_parent" />

	    </LinearLayout>

	

	    <FrameLayout

	        android:layout_width="200dp"

	        android:layout_height="match_parent"

	        android:layout_gravity="left"

	        android:background="#000" >

	

	        <TextView

	            android:layout_width="wrap_content"

	            android:layout_height="wrap_content"

	            android:text="我是侧边栏"

	            android:textColor="#fff" />

	    </FrameLayout>



	</android.support.v4.widget.DrawerLayout>

初始化ActionBar

	/**
  • 初始化actionbar
     */
     private void initActionBar() {
     // 获取actionbar对象
     ActionBar actionBar = getSupportActionBar();
     // 左上角显示logo
     actionBar.setHomeButtonEnabled(true);
     // 左上角显示返回图标, 和侧边栏绑定后显示侧边栏图标
     actionBar.setDisplayHomeAsUpEnabled(true);

      	// 初始化侧边栏开关
    
      	mToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
    
      			R.drawable.ic_drawer_am, R.string.drawer_open,
    
      			R.string.drawer_close);// 参2:DrawerLayout对象, 参3:侧边栏开关图标,
    
      									// 参4:打开侧边栏文本描述;参5:关闭侧边栏文本描述
    
      	// 调用当前同步方法,才可以将侧拉菜单和按钮的点击操作绑定起来
    
      	mToggle.syncState();
    
      }
    

点击打开或关闭侧边栏

	// ActionBar上的按钮被点击后的回调方法

	@Override

	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {

		case android.R.id.home:// 左上角logo处被点击

			mToggle.onOptionsItemSelected(item);//侧边栏收起或者关闭

			break;



		default:

			break;

		}



		return super.onOptionsItemSelected(item);

	}

应用详情页面ActionBar

	/**
  • 初始化actionbar
     */
     private void initActionBar() {
     // 获取actionbar对象
     ActionBar actionBar = getSupportActionBar();
     // 左上角显示logo
     actionBar.setHomeButtonEnabled(true);
     // 左上角显示返回图标
     actionBar.setDisplayHomeAsUpEnabled(true);
     }

      @Override
    
      public boolean onOptionsItemSelected(MenuItem item) {
    
      	switch (item.getItemId()) {
    
      	case android.R.id.home:// 左上角logo处被点击
    
      		finish();
    
      		break;
    
    
    
      	default:
    
      		break;
    
      	}
    
    
    
      	return super.onOptionsItemSelected(item);
    
      }
    
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值