Android学习笔记之多线程间的异步通信
来源:互联网 发布:如何她推做淘宝客 编辑:程序博客网 时间:2024/06/05 04:26
添加一个按钮,并指定一个按钮的点击事件:
public void btnClicked(){ new Thread(new Runnable() { //模拟一个网络请求事件 @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(1); } }); //handler.sendEmptyMessageDelayed(1,2000);//两秒后发送消息}
定义一个Handler对象:
private Handler handler = new Handler(){ //接收消息等待处理 @Override public void handleMessage(Message msg) { //回到主线程 switch (msg.what){ case 1: button.setText("按钮被改变了"); break; default: break; } }};
点击了按钮后,实现了按钮的文字改变为指定的内容。因为UI控件的修改只能在主线程中执行,所以当我们在自定义的子线程中修改按钮的文字时会导致程序运行的崩溃。
使用Message类发送消息
Message message = new Message();String str = "Message";message.obj = str;message.what = 2;handler.sendMessage(message);
消息接收处理:
case 2: String str = (String) msg.obj; button.setText(str); break;
使用post方法
public void testPost(){ new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //在非主线程中更新UI控件的内容 handler.post(new Runnable() { @Override public void run() { button.setText("12df"); } }); } });}
post的类方法允许排列一个Runnable对象到主线程中,等待执行。
子线程中更新UI控件内容的其他方法:
runOnUiThread(new Runnable() { @Override public void run() { button.setText("3dfs"); } });
view控件+post方法
button.post(new Runnable() { @Override public void run() { button.setText("sergs34"); } });
AsyncTask异步任务类
/*AsyncTask的三个参数* 参数一:执行异步任务时需要传入的三个的参数,可用于在后台任务中执行* 参数二:后台任务执行时,若需要在前台显示进度,则使用这里指定的参数作为进度单位* 参数三:异步任务执行结束后返回的结果* */class TestTask extends AsyncTask<Void,Void,String>{ //在异步线程里执行 @Override protected String doInBackground(Void... voids) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } String string = "asyncTask"; return string; } //接收子线程返回的字符串,切换到主线程执行 @Override protected void onPostExecute(String s) { button.setText(s); }}
AyncTask类常用的方法:
- onPreExecute():在后台异步任务执行开始前调用;
- doInBackground():该方法里所有的代码都在自线程中执行,常用来处理一些耗时的操作。任务结束后,返回执行的结果也可以不返回(视类的第三个参数而定)。
- onProgressUpdate():接收后台publishProgress(int)方法传递的参数,用来更新前台的UI控件;
- onPostExecute():后台任务执行接收后,根据后台执行返回的结果更新前台的UI内容。
应用实例
.xml文件
<Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClicked" android:text="Hello World!" /> <ProgressBar android:id="@+id/pb" android:layout_width="match_parent" android:layout_height="20dp" android:layout_centerInParent="true" android:visibility="gone" android:max="100" style="?android:attr/progressBarStyleHorizontal" />
.java文件
public class MainActivity extends AppCompatActivity { private Button button; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.btn); progressBar = (ProgressBar) findViewById(R.id.pb); } public void btnClicked(View view){ new TestAsyncTask().execute(); } class TestAsyncTask extends AsyncTask<Void,Integer,Boolean>{ int pregress; @Override protected void onPreExecute() { super.onPreExecute(); Log.d("TAG","准备下载"); progressBar.setVisibility(View.VISIBLE); } @Override protected Boolean doInBackground(Void... voids) { Log.d("TAG","正在下载"); try { while (true){ //每隔一秒下载10% Thread.sleep(1000); pregress+=10; // 通知主线程当前进度是多少 publishProgress(pregress); //退出永久循环 if (pregress>=100){ break; } } } catch (Exception e){ return false; } return true; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.d("TAG","已下载"+values[0]+“%”); progressBar.setProgress(values[0]); } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); if (aBoolean){ Log.d("TAG","下载成功"); progressBar.setVisibility(View.GONE);//隐藏进度条 } else { Log.d("TAG","下载失败"); } } } }
终端输出:
03-28 18:37:34.840 619-619/com.example.felix.asynctaask D/TAG: 准备下载 03-28 18:37:34.853 619-3897/com.example.felix.asynctaask D/TAG: 正在下载 03-28 18:37:35.889 619-619/com.example.felix.asynctaask D/TAG: 已下载10% 03-28 18:37:36.901 619-619/com.example.felix.asynctaask D/TAG: 已下载20% 03-28 18:37:37.907 619-619/com.example.felix.asynctaask D/TAG: 已下载30% 03-28 18:37:38.939 619-619/com.example.felix.asynctaask D/TAG: 已下载40% 03-28 18:37:39.981 619-619/com.example.felix.asynctaask D/TAG: 已下载50% 03-28 18:37:41.019 619-619/com.example.felix.asynctaask D/TAG: 已下载60% 03-28 18:37:42.060 619-619/com.example.felix.asynctaask D/TAG: 已下载70% 03-28 18:37:43.106 619-619/com.example.felix.asynctaask D/TAG: 已下载80% 03-28 18:37:44.148 619-619/com.example.felix.asynctaask D/TAG: 已下载90% 03-28 18:37:45.192 619-619/com.example.felix.asynctaask D/TAG: 已下载100% 03-28 18:37:45.192 619-619/com.example.felix.asynctaask D/TAG: 下载成功
0 0
- Android学习笔记之多线程间的异步通信
- Android深入浅出学习笔记之多线程及异步处理
- Android深入浅出学习笔记之多线程及异步处理
- Android深入浅出学习笔记之多线程及异步处理
- Android学习笔记之多线程
- android学习笔记之多线程学习
- android学习笔记之多线程(二)
- 学习笔记之多线程
- Android学习之多线程
- android学习笔记asyncTask的多线程异步通信
- android学习笔记asyncTask的多线程异步通信
- iOS开发之多线程(线程间的通信)
- Android学习笔记_13_网络通信之多个上传文件
- JAVA学习笔记之多线程
- Python学习笔记之多线程
- python学习笔记之多线程
- iPhone学习之多线程笔记
- Java学习笔记之多线程
- springmvc使用Hibernate的校验框架validation
- 自顶向下分析一个简单的语音识别系统(五)
- QDUOJ 29 帅气的HYC与N皇后(最大独立集)
- MySQL笔记-procedure与function
- 插入排序、半分插入排序、希尔排序
- Android学习笔记之多线程间的异步通信
- python socket 创建tcp服务器和客户端
- 负载均衡
- 具体实例教你如何做LoadRunner结果分析
- Java编程思想-并发(3)
- Android问题—SQLite存储大二进制文件
- 快速排序
- 523. Continuous Subarray Sum
- 可靠简单的 解决Microsoft.Jet.OLEDB.4.0 不能在64位系统下使用的问题