zoukankan      html  css  js  c++  java
  • AsyncTask实例代码演示Android异步任务

    我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。

      首先Android123以简单的下载例子演示该类的大致结构,如下

      private class DownloadFilesTask extends AsyncTask {

      protected Long doInBackground(URL... urls) {

      int count = urls.length;

      long totalSize = 0;

      for (int i = 0; i < count; i++) {

      totalSize += Downloader.downloadFile(urls[i]);

      publishProgress((int) ((i / (float) count)100));

      }

      return totalSize;

      }

      protected void onProgressUpdate(Integer... progress) {

      setProgressPercent(progress[0]);

      }

      protected void onPostExecute(Long result) {

      showDialog("Downloaded " + result + " bytes");

      }

      }

      最终我们执行 DownloadFilesTask().execute(url1, url2, url3); 即可。

      在Android浏览器中下载Favicon图标的实现如下:

      class DownloadTouchIcon extends AsyncTask {

      private final ContentResolver mContentResolver;

      private final Cursor mCursor;

      private final String mOriginalUrl;

      private final String mUrl;

      private final String mUserAgent;

      /* package */ BrowserActivity mActivity;

      public DownloadTouchIcon(BrowserActivity activity, ContentResolver cr,

      Cursor c, WebView view) { //构造方法

      mActivity = activity;

      mContentResolver = cr;

      mCursor = c;

      mOriginalUrl = view.getOriginalUrl();

      mUrl = view.getUrl();

      mUserAgent = view.getSettings().getUserAgentString();

      }

      public DownloadTouchIcon(ContentResolver cr, Cursor c, String url) { //实现本类的构造

      mActivity = null;

      mContentResolver = cr;

      mCursor = c;

      mOriginalUrl = null;

      mUrl = url;

      mUserAgent = null;

      }

      @Override

      public Bitmap doInBackground(String... values) { //返回Bitmap类型

      String url = values[0];

      AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);

      HttpGet request = new HttpGet(url);

      HttpClientParams.setRedirecting(client.getParams(), true); //处理302等重定向问题

      try {

      HttpResponse response = client.execute(request);

      if (response.getStatusLine().getStatusCode() == 200) { //如果OK

      HttpEntity entity = response.getEntity();

      if (entity != null) {

      InputStream content = entity.getContent(); //将图标保存到InputStream中,因为是二进制内容

      if (content != null) {

      Bitmap icon = BitmapFactory.decodeStream( //从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream

      content, null, null);

      return icon;

      }

      }

      }

      } catch (IllegalArgumentException ex) {

      request.abort();

      } catch (IOException ex) {

      request.abort();

      } finally {

      client.close();

      }

      return null;

      }

      @Override

      protected void onCancelled() {

      if (mCursor != null) {

      mCursor.close();

      }

      }

      @Override

      public void onPostExecute(Bitmap icon) {

      if (mActivity != null) {

      mActivity.mTouchIconLoader = null;

      }

      if (icon == null || mCursor == null || isCancelled()) {

      return;

      }

      最终图标要保存到浏览器的内部数据库中,系统程序均保存为SQLite格式,Browser也不例外,因为图片是二进制的所以使用字节数组存储数据库的BLOB类型

      final ByteArrayOutputStream os = new ByteArrayOutputStream();

      icon.compress(Bitmap.CompressFormat.PNG, 100, os); //将Bitmap压缩成PNG编码,质量为100%存储

      ContentValues values = new ContentValues(); //构造SQLite的Content对象,这里也可以使用raw sql代替

      values.put(Browser.BookmarkColumns.TOUCH_ICON,os.toByteArray()); //写入数据库的Browser.BookmarkColumns.TOUCH_ICON字段

      if (mCursor.moveToFirst()) {

      do {

      mContentResolver.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, mCursor.getInt(0)),values, null, null);

      } while (mCursor.moveToNext());

      }

      mCursor.close();

      }

      }

      本次Android开发网通过两个AsyncTask类演示了多种类型的任务构造,这里大家注意返回类型,本节演示了Android平台上 Content Provider、AsyncTask、Bitmap、HTTP以及Stream的相关操作,大家如何想很快提高开发水平其实只要理解Google如何去实现Android系统常规构架就可以轻松入门谷歌移动平台。

    引用:http://mips.eefocus.com/article/10-08/1968501282623682.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 师座操作系统
    Java实现 蓝桥杯VIP 算法提高 师座操作系统
    Java实现 蓝桥杯VIP 算法提高 师座操作系统
    Qt_5_3_MSVC2012-编译QFtp-qt5编译QFtp
    存储入门 – RAID技术(大图解释)
    为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样
    360云盘服务端前来回答
    SMB2 Protocol – 简介(应用层协议主要用于在计算机间共享文件、打印机、串口等)
    MVC 5
    集合
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2088161.html
Copyright © 2011-2022 走看看