Android AsyncTack 异步任务实例详解


Posted in PHP onNovember 02, 2016

Android AsyncTack 异步任务

              这里写一个小实例,来学习巩固Android AsyncTack 异步任务的知识,以便在项目中使用。

介绍一下如何使用

1, 继承AsyncTask

public class MyTask extends AsyncTask<Params, Progrss, Result>

我们来说一下这三个泛型的作用:

Params: 调用异步任务时传入的类型 ;

Progress : 字面意思上说是进度条, 实际上就是动态的由子线程向主线程publish数据的类型

Result : 返回结果的类型

2, 重写这个类的抽象方法doInBackground, 当然它也有几个方法需要重写, 我们一一看来

doInBackground(抽象方法, 必须实现)

/* 唯一执行在子线程中的方法
 *  所以不可以进行UI的更新
 * @param params
 * @return
 */
@Override//返回值: Result    参数: Param
protected String doInBackground(TextView... params) {
  text = params[0];
  Random random = new Random();
  for (int i = 0; i < 50; i++) {
    //要进行进度的更新
    publishProgress(i);
    //不能直接调用onProgressUpdate方法,
    //这样会使得onProgressUpdate在子线程中运行
    try {
      Thread.sleep(random.nextInt(10) * 10);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  return "已完成";
}

下面三个方法根据具体情况选择使用

//执行doInBackground之前调用
  @Override
  protected void onPreExecute() {
    super.onPreExecute();
  }
@Override//与publishProgress(i)对应
  protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    text.setText(String.valueOf(values[0]));
  }
//在doInBackground之后执行
  @Override // 参数s为 Result
  protected void onPostExecute(String s) {
    super.onPostExecute(s);
    text.setText(s);
  }

3, 执行异步任务

有两种方式, 我已经把区别写在了注释中
/*
 直接execute异步任务, 都是同一线程去执行
*/

text = (TextView) findViewById(R.id.main_text1);
new MyTask().execute(text);
text = (TextView) findViewById(R.id.main_text2);
new MyTask().execute(text);
text = (TextView) findViewById(R.id.main_text3);
new MyTask().execute(text);
text = (TextView) findViewById(R.id.main_text4);
new MyTask().execute(text);
/*
  启动多条线程来执行异步任务
  API11以上可以使用
*/
 ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(4);
 text = (TextView) findViewById(R.id.main_text1);
 new MyTask().executeOnExecutor(executor, text);
 text = (TextView) findViewById(R.id.main_text2);
 new MyTask().executeOnExecutor(executor, text);
 text = (TextView) findViewById(R.id.main_text3);
 new MyTask().executeOnExecutor(executor, text);
 text = (TextView) findViewById(R.id.main_text4);
 new MyTask().executeOnExecutor(executor, text);

注意: 如果我们直接去execute我们的任务, 它(任务) 只会在同一个子线程中运行, 所以上述第一种方式启动时, 四个任务顺次执行(就是一个任务执行完了再执行另一个); 而第二种方式, 给它创建了线程池, 这样会自动给它创建新的子线程, 所有的任务不是顺序执行, 而是几个线程”同时执行”

获取网络数据呈现在Webview和下载图片和其共存的案例

1, 首先我们要来一个布局, 具体需求是这样的, 在WebView之上有个ImageView, 并且, ImageView可以随WebView滚动, 所以这个时候我们想到了用ScrollView, 但是大家一定不要忘记, ScrollView只能包含一个控件, 所以我们可以用LinearLayout包裹一下即可

<ScrollView
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
      android:id="@+id/main2_image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
    <WebView
      android:id="@+id/main2_web"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>
  </LinearLayout>
</ScrollView>

2, 接下来我们要有一个实体类, 用来存放从网页上下载的内容(这里加注解原因在于我们要使用GSON解析来自网页的内容)

public class Entry {
  @SerializedName("title")
  private String title;
  @SerializedName("message")
  private String message;
  @SerializedName("img")
  private String image;

  public String getTitle() {
    return title;
  }
  ...//省略其余getter和setter方法
  public void setImage(String image) {
    this.image = image;
  }
}

3, 那我们接下解决的问题就是 如何下载图片? 如何下载web内容? , 那我们写两个通用的工具类

下载工具类(通用型)

/**
 * Created by Lulu on 2016/8/31.
 * <p/>
 * 通用下载工具类
 */
public class NetWorkTask<T> extends AsyncTask<NetWorkTask.Callback<T>, Void, Object> {

  private NetWorkTask.Callback<T> callback;
  private Class<T> t;
  private String url;

  public NetWorkTask(String url, Class<T> t) {
    this.url = url;
    this.t = t;
  }
  @Override
  protected Object doInBackground(Callback<T>... params) {
    callback = params[0];

    try {

      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
      connection.setRequestMethod("GET");
      connection.setDoInput(true);
      int code = connection.getResponseCode();
      if (code == 200) {
        InputStream is = connection.getInputStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buffer = new byte[102400];
        int length;
        while ((length = is.read(buffer)) != -1) {
          bos.write(buffer, 0, length);
        }
        return bos.toString("UTF-8");
      } else {
        return new RuntimeException("服务器异常");
      }

    } catch (Exception e) {
      e.printStackTrace();
      return e;
    }

  }

  @Override
  protected void onPostExecute(Object o) {
    super.onPostExecute(o);
    if(o instanceof String) {
      String str = (String) o;
      Gson gson = new Gson();
      T t = gson.fromJson(str, this.t);
      callback.onSuccess(t);
    }
    if( o instanceof Exception) {
      Exception e = (Exception) o;
      callback.onFailed(e);
    }
  }
  public interface Callback<S> {
    void onSuccess(S t);
    void onFailed(Exception e);
  }
}

图片加载器(通用型)

/**
 * Created by Lulu on 2016/8/31.
 * 图片网络加载器
 * 下载成功返回Bitmap
 * 否则返回null
 */
public class ImageLoader extends AsyncTask<String, Void, Bitmap>{

  private ImageView image;

  public ImageLoader(ImageView image) {
    this.image = image;
    image.setImageResource(R.mipmap.ic_launcher);
  }

  @Override
  protected void onPreExecute() {
    super.onPreExecute();

  }

  @Override
  protected Bitmap doInBackground(String... params) {
    String url = params[0];
    try {
      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
      connection.setRequestMethod("GET");
      connection.setDoInput(true);
      int code = connection.getResponseCode();
      if (code == 200) {
        InputStream is = connection.getInputStream();
        return BitmapFactory.decodeStream(is);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }


  @Override
  protected void onPostExecute(Bitmap bitmap) {
    super.onPostExecute(bitmap);
    if (bitmap != null) {
      image.setImageBitmap(bitmap);
    } else {
      image.setImageResource(R.mipmap.failed);
    }
  }
}

4, 测试Activity

注意: 看如何解决大图在webView中不左右滑动的问题!

public class Main2Activity extends AppCompatActivity implements NetWorkTask.Callback<Entry>{
  private WebView web;
  private ImageView image;
  //解决大图在webView中不左右滑动的问题
  private static final String CSS = "<style>img{max-width:100%} </style>";
  private String title;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    web = (WebView) findViewById(R.id.main2_web);
    image = (ImageView) findViewById(R.id.main2_image);
    new NetWorkTask<>("http://www.tngou.net/api/top/show?id=13122", Entry.class).execute(this);
  }
  @Override
  public void onSuccess(Entry t) {
    web.loadDataWithBaseURL("", t.getMessage(), "text/html; charset=utf-8", "UTF-8", null);
    new ImageLoader(image).execute("http://img.blog.csdn.net/20160829134937003");
  }
  @Override
  public void onFailed(Exception e) {
    web.loadDataWithBaseURL("", "加载失败", "text/html; charset=utf-8", "UTF-8", null);
  }
}

5.效果图:

Android AsyncTack 异步任务实例详解

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
discuz Passport 通行证 整合笔记
Jun 30 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
php 使用file_get_contents读取大文件的方法
Nov 13 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
YII2 全局异常处理深入讲解
Mar 24 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 #PHP
PHP设置images目录不充许http访问的方法
Nov 01 #PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 #PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 #PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 #PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 #PHP
CI框架无限级分类+递归的实现代码
Nov 01 #PHP
You might like
yii框架中的Url生产问题小结
2012/01/16 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
python先序遍历二叉树问题
2017/11/10 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
如何使用python进行pdf文件分割
2019/11/11 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python列表list操作相关知识小结
2020/01/29 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
python 实现逻辑回归
2020/12/30 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
领导班子整改方案和个人整改措施
2014/10/25 职场文书
拾金不昧表扬信
2015/01/16 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书