Android线程阻塞解决方案(二)
2015-11-10 18:18
344 查看
既然Android的不同意使用子线程来进行数据设置,那么我们就耗时操作完成后再进行数据操作,查看官方API,官方说使用
1.View.post
2.AsyncTask
我们先用post测试使用一下
![](http://img.blog.csdn.net/20151110175516621?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个过程说明了我们的赋值操作是在线程执行完成后进行的,又根据Android官方的API提出的观点来讲,这说明一定有一个“第三者”充当传达命令角色:主线程分配任务给“第三者”,子线程从“第三者”中去取抓取任务。
(其实第三者就是Handler)
由于上面的代码可读性差,代码冗余,所以官方对这段代码进行封装
1.View.post
2.AsyncTask
我们先用post测试使用一下
public class MainActivity extends Activity { private Button yidongBtn=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); yidongBtn=(Button)findViewById(R.id.yidongBtn); //给btn设置动画 TranslateAnimation animation=new TranslateAnimation(0,1500,0,0); animation.setRepeatCount(20); animation.setDuration(2000); yidongBtn.setAnimation(animation); final Button btn2=(Button)findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { //1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程) System.out.println("new子线程开始执行..."); new Thread(new Runnable() { @Override public void run() { //设置其耗时操作 try { Thread.sleep(5000); } catch (InterruptedException e) { Log.i("耗时操作",e.getMessage()); } v.post(new Runnable() { @Override public void run() { int sum=10; btn2.setText("计数:"+sum); System.out.println("View.post视图post被执行了...."); } }); System.out.println("new子线程执行结束..."); } }).start(); } }); }我们检测一下这个执行过程,发现打印的顺序是:
这个过程说明了我们的赋值操作是在线程执行完成后进行的,又根据Android官方的API提出的观点来讲,这说明一定有一个“第三者”充当传达命令角色:主线程分配任务给“第三者”,子线程从“第三者”中去取抓取任务。
(其实第三者就是Handler)
由于上面的代码可读性差,代码冗余,所以官方对这段代码进行封装
private Button yidongBtn=null; private Button btn2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); yidongBtn=(Button)findViewById(R.id.yidongBtn); //给btn设置动画 TranslateAnimation animation=new TranslateAnimation(0,1500,0,0); animation.setRepeatCount(20); animation.setDuration(2000); yidongBtn.setAnimation(animation); btn2=(Button)findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new ChangeAnsyncTask().execute(); } }); /** btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { //1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程) System.out.println("UI线程Id:"+Thread.currentThread().getId()); System.out.println("new子线程开始执行..."); new Thread(new Runnable() { @Override public void run() { //设置其耗时操作 try { Thread.sleep(5000); } catch (InterruptedException e) { Log.i("耗时操作",e.getMessage()); } v.post(new Runnable() { @Override public void run() { int sum=10; btn2.setText("计数:"+sum); System.out.println("View.post视图post被执行了...."); } }); System.out.println("new子线程执行结束..."); } }).start(); } }); **/ } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public class ChangeAnsyncTask extends AsyncTask<String, Void, Integer>{ protected Integer doInBackground(String... params) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } int sum=10; return sum; } @Override protected void onPostExecute(Integer result) { btn2.setText("变形:"+result); super.onPostExecute(result); } }很明显上面的代码松耦合,对线程阻塞问题有限的代码封装,更有利于实际开发。
相关文章推荐
- AsyncTask详解
- Android Jni 多线程 蓝牙串口收发 实例 二
- Android Aidl 机制
- Android Jni 多线程 蓝牙串口收发 实例 一
- [Android开发]屏幕适配问题
- Android四组件之Service&Demo
- android系统中使用TelephonyManager类来获取imei号和其他手机信息
- Android Jni 基础笔记
- LocalBroadcastManager—创建更高效、更安全的广播
- android 6.0编译
- Android 绘图之一:Canvas 及 Paint 简介
- Android三句代码使用沉浸式状态栏
- 详解Android源码目录
- android drawableRight 添加点击事件
- Android:Java.lang.IllegalStateException Activity has been destroyed
- android5.0_RecycleView初识
- android studio gradle 打包
- Android消息通信 第三方开源项目EventBus 的用法
- Android Fragment 真正的完全解析(上)
- Android——实用小技巧