Android AsyncTack 异步任务实例详解
php  /  管理员 发布于 7年前   287
Android AsyncTack 异步任务 这里写一个小实例,来学习巩固Android AsyncTack 异步任务的知识,以便在项目中使用。 介绍一下如何使用 1, 继承AsyncTask public class MyTask extends AsyncTask 我们来说一下这三个泛型的作用: Params: 调用异步任务时传入的类型 ; Progress : 字面意思上说是进度条, 实际上就是动态的由子线程向主线程publish数据的类型 Result : 返回结果的类型 2, 重写这个类的抽象方法doInBackground, 当然它也有几个方法需要重写, 我们一一看来 doInBackground(抽象方法, 必须实现) 下面三个方法根据具体情况选择使用 3, 执行异步任务 注意: 如果我们直接去execute我们的任务, 它(任务) 只会在同一个子线程中运行, 所以上述第一种方式启动时, 四个任务顺次执行(就是一个任务执行完了再执行另一个); 而第二种方式, 给它创建了线程池, 这样会自动给它创建新的子线程, 所有的任务不是顺序执行, 而是几个线程”同时执行” 获取网络数据呈现在Webview和下载图片和其共存的案例 1, 首先我们要来一个布局, 具体需求是这样的, 在WebView之上有个ImageView, 并且, ImageView可以随WebView滚动, 所以这个时候我们想到了用ScrollView, 但是大家一定不要忘记, ScrollView只能包含一个控件, 所以我们可以用LinearLayout包裹一下即可 2, 接下来我们要有一个实体类, 用来存放从网页上下载的内容(这里加注解原因在于我们要使用GSON解析来自网页的内容) 3, 那我们接下解决的问题就是 如何下载图片? 如何下载web内容? , 那我们写两个通用的工具类 下载工具类(通用型) 图片加载器(通用型) 4, 测试Activity 注意: 看如何解决大图在webView中不左右滑动的问题! 5.效果图: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!/* 唯一执行在子线程中的方法 * 所以不可以进行UI的更新 * @param params * @return */@Override//返回值: Result 参数: Paramprotected 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); }
有两种方式, 我已经把区别写在了注释中/* 直接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);
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; }}
/** * Created by Lulu on 2016/8/31. * * 通用下载工具类 */public class NetWorkTask
{ void onSuccess(S t); void onFailed(Exception e); }}/** * Created by Lulu on 2016/8/31. * 图片网络加载器 * 下载成功返回Bitmap * 否则返回null */public class ImageLoader extends AsyncTask
public class Main2Activity extends AppCompatActivity implements NetWorkTask.Callback
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号