AsnyncTask与handler(二)——handler消息机制

本文介绍如何使用Handler机制实现在AsyncTask的doInBackground方法中更新UI。通过具体实例展示了Handler对象如何在子线程中向主线程发送消息,进而实现界面更新。

前言:继上篇,上篇中实现了AsyncTask异步加载图片,在文章最后,我们抛出了个问题:“如果想在doInBackground()中更新UI怎么办”这篇文章就是解决这个问题的,本篇程序建立在上篇基础之上,在看本篇之前,请先移步上篇《AsnyncTask与handler(一)——AsyncTask异步处理

相关文章:《AsnyncTask与handler(一)——AsyncTask异步处理

一、handler消息机制

Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器。2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

使用handler机制的方法:
1、新建一个handler类来处理主线程中的UI更新问题

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private class MyHandler extends Handler{     
  2.      @Override  
  3.      public void handleMessage(Message msg) {//处理消息  
  4.            
  5.          switch (msg.what) {  
  6.         case 1:  
  7.             String str=(String) msg.obj;  
  8.               
  9.             Toast.makeText(getApplicationContext(),str, Toast.LENGTH_SHORT).show();  
  10.             break;  
  11.         default:  
  12.             break;  
  13.         }  
  14.      }   
  15. }  

2、定义变量与赋值
定义一个变量Handler m_mainHandler;然后在OnCreate()函数中对其初始化:m_mainHandler=new MyHandler();

3、发送消息

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Message msg=new Message();  
  2. msg.what=1;  
  3. msg.obj="传回图片了";  
  4. m_mainHandler.sendMessage(msg); //发送消息更新UI  

二、实例

在上篇的基础上,在doInBackground()中利用handler发送消息,使其发出Toast消息提示---“传回照片了”。

总体效果为:


XML没变,JAVA代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.try_asynctask_handler;  
  2. import java.io.InputStream;  
  3. import java.net.URL;  
  4. import java.net.URLConnection;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import android.os.AsyncTask;  
  9. import android.os.Bundle;  
  10. import android.os.Debug;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.app.Activity;  
  14. import android.content.Context;  
  15. import android.graphics.Bitmap;  
  16. import android.graphics.BitmapFactory;  
  17. import android.util.Log;  
  18. import android.view.Menu;  
  19. import android.view.View;  
  20. import android.view.View.OnClickListener;  
  21. import android.widget.Button;  
  22. import android.widget.ImageView;  
  23. import android.widget.ProgressBar;  
  24. import android.widget.Toast;  
  25.   
  26. public class MainActivity extends Activity {  
  27.   
  28.     private ImageView   image       = null;  
  29.     private Button      show;  
  30.     private ProgressBar progressBar = null;  
  31.     private int         number      = 0;  
  32.     List<String>      imageUrl    = null;  
  33.       
  34.     Handler m_mainHandler;  
  35.       
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.activity_main);  
  40.           
  41.         m_mainHandler=new MyHandler();  
  42.           
  43.         progressBar = (ProgressBar) findViewById(R.id.processBar);  
  44.         image = (ImageView) findViewById(R.id.image);  
  45.         show = (Button) findViewById(R.id.show);  
  46.         show.setOnClickListener(new showButtonListener());  
  47.           
  48.         imageUrl = new ArrayList<String>(); // 图片地址List  
  49.         imageUrl.add("http://image.tianjimedia.com/uploadImages/2011/266/AIO90AV2508S.jpg");  
  50.         imageUrl.add("http://image.tianjimedia.com/uploadImages/2012/090/063N2L5N2HID.jpg");  
  51.         imageUrl.add("http://comic.sinaimg.cn/2011/0824/U5237P1157DT20110824161051.jpg");  
  52.         imageUrl.add("http://image.tianjimedia.com/uploadImages/2012/090/1429QO6389U8.jpg");  
  53.         imageUrl.add("http://new.aliyiyao.com/UpFiles/Image/2011/01/13/nc_129393721364387442.jpg");  
  54.     }  
  55.   
  56.     public class showButtonListener implements OnClickListener  
  57.     {  
  58.         @Override  
  59.         public void onClick(View v)  
  60.         {  
  61.             number++;  
  62.             MyAsyncTask myAsyncTask = new MyAsyncTask(getApplicationContext());  
  63.             myAsyncTask.execute(imageUrl.get(number % 5));  
  64.         }  
  65.     }  
  66.       
  67.     class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>  
  68.     {  
  69.         // 可变长的输入参数,与AsyncTask.exucute()对应  
  70.         public MyAsyncTask(Context context)  
  71.         {  
  72.             progressBar.setVisibility(View.VISIBLE);  
  73.             image.setVisibility(View.GONE);  
  74.         }  
  75.         @Override  
  76.         protected Bitmap doInBackground(String... params)  
  77.         {  
  78.             Bitmap bitmap = null;  
  79.             try  
  80.             {  
  81.                 //根据URL取得图片并返回   
  82.                 URL url = new URL(params[0]);    
  83.                   
  84.                 URLConnection conn = url.openConnection();    
  85.                 conn.connect();    
  86.                 InputStream inputStream = conn.getInputStream();    
  87.                 bitmap = BitmapFactory.decodeStream(inputStream);    
  88.                   
  89.                 Message msg=new Message();  
  90.                 msg.what=1;  
  91.                 msg.obj="传回图片了";  
  92.                 m_mainHandler.sendMessage(msg); //发送消息更新UI  
  93.                   
  94. //              Toast.makeText(getApplicationContext(), "传回图片了", Toast.LENGTH_SHORT).show();  
  95.                 inputStream.close();  
  96.             }  
  97.             catch (Exception e)  
  98.             {  
  99.                 Log.e("msg", e.getMessage());  
  100.             }  
  101.             return bitmap;  
  102.         }  
  103.   
  104.         /** 
  105.          * 在doInBackground 执行完成后,onPostExecute方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 
  106.          */  
  107.         @Override  
  108.         protected void onPostExecute(Bitmap bitmap)  
  109.         {  
  110.             progressBar.setVisibility(View.GONE);  
  111.             image.setVisibility(View.VISIBLE);  
  112.             if (bitmap != null)  
  113.             {  
  114.                 image.setImageBitmap(bitmap);  
  115.             }  
  116.             else  
  117.             {  
  118.                 Toast.makeText(getApplicationContext(), "网络异常", Toast.LENGTH_SHORT).show();  
  119.             }  
  120.         }  
  121.   
  122.         /** 
  123.          * 该方法将在执行实际的后台操作前被UI thread调用。这个方法只是做一些准备工作,如在界面上显示一个进度条。 
  124.          */  
  125.         @Override  
  126.         protected void onPreExecute()  
  127.         {  
  128.             // 任务启动  
  129.             Toast.makeText(getApplicationContext(), "任务开始......", Toast.LENGTH_SHORT).show();  
  130.         }  
  131.     }  
  132.       
  133.     /** 
  134.      * 新建一个handler类来处理主线程中的UI更新问题 
  135.      * @author Administrator 
  136.      * 
  137.      */  
  138.     private class MyHandler extends Handler{     
  139.          @Override  
  140.          public void handleMessage(Message msg) {//处理消息  
  141.                
  142.              switch (msg.what) {  
  143.             case 1:  
  144.                 String str=(String) msg.obj;  
  145.                   
  146.                 Toast.makeText(getApplicationContext(),str, Toast.LENGTH_SHORT).show();  
  147.                 break;  
  148.             default:  
  149.                 break;  
  150.             }  
  151.          }   
  152.     }  
  153.   
  154. }  

根据上面的使用handler步骤写出以后代码难度不大,这里就不再详细讲解了。

其它

1、handler的另一用法

1、在主线程中创建

m_mianhandler=new Handler();

2、用的时候:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private void promptAlertDialog()  
  2. {  
  3.      m_mainHandler.post(new Runnable() {  
  4.             public void run() {  
  5.         ……   
  6.             }  
  7.         });  
  8. }  

这一用法部分相关文章:

《Android--多线程之Handler》:http://www.cnblogs.com/plokmju/p/android_handler.html
 




源码地址:http://download.youkuaiyun.com/detail/harvic880925/7275431 ,不要分,仅供分享


请大家尊重原创者版权,转载请标明出处:http://blog.youkuaiyun.com/harvic880925/article/details/24783459,不胜感激!

基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)内容概要:本文档介绍了基于遗传算法的微电网调度模型,涵盖风能、太阳能、蓄电池和微型燃气轮机等多种能源形式,并通过Matlab代码实现系统优化调度。该模型旨在解决微电网中多能源协调运行的问题,优化能源分配,降低运行成本,提高可再生能源利用率,同时考虑系统稳定性经济性。文中详细阐述了遗传算法在求解微电网多目标优化问题中的应用,包括编码方式、适应度函数设计、约束处理及算法流程,并提供了完整的仿真代码供复现学习。此外,文档还列举了大量相关电力系统优化案例,如负荷预测、储能配置、潮流计算等,展示了广泛的应用背景和技术支撑。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能电网优化研究的工程技术人员。; 使用场景及目标:①学习遗传算法在微电网调度中的具体实现方法;②掌握多能源系统建模优化调度的技术路线;③为科研项目、毕业设计或实际工程提供可复用的代码框架算法参考; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注目标函数构建约束条件处理,同时可参考文档中提供的其他优化案例进行拓展学习,以提升综合应用能力。
此项目旨在实现一个简易而实用的RFID智能门禁控制系统。采用经典的51系列单片机——STC89C52作为核心控制器,集成MFRC522射频识别模块来读取RFID卡片信息。用户界面通过128x64像素的LCD显示屏展示相关信息,同时配备了键盘用于密码的输入、验证及修改。此设计结合了RFID技术的高效率识别单片机的强大控制能力,适用于学习、教学或小型安防项目。 资源包含 源代码:完整C语言编写的源程序,涵盖了RFID识别、密码验证逻辑、显示控制以及用户交互等功能模块。 原理图:详细展示了整个系统的电路连接,包括单片机、MFRC522模块、LCD12864屏幕、按键等组件的电气连接方式,便于理解和自制。 技术特点 RFID技术应用:通过MFRC522模块实现非接触式身份认证,提升门禁安全性便捷性。 人机交互界面:利用LCD12864显示屏直观展示状态信息,并通过物理按键进行操作,增加了系统的易用性。 密码安全机制:支持用户密码的设定和更改,增强系统安全性。 51单片机编程:适合初学者和专业人士学习51单片机应用开发,尤其是嵌入式系统物联网领域的实践。 使用指南 环境搭建:确保你有合适的IDE(如Keil uVision)安装以编译51单片机的C代码。 原理图分析:详细阅读原理图,了解各部件间的连接,这对于正确搭建硬件平台至关重要。 编译上传:将提供的源代码编译无误后,通过编程器或ISP接口烧录到STC89C52单片机中。 硬件组装:根据原理图搭建电路,确保所有组件正确连接。 测试调试:完成后进行功能测试,可能需要对代码或硬件做适当调整以达到最佳工作状态。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文研究基于非支配排序的蜣螂优化算法(NSDBO)在微电网多目标优化调度中的应用,旨在解决微电网运行中经济性、环保性稳定性等多重目标的协同优化问题。文中详细介绍了NSDBO算法的设计实现过程,结合Matlab代码对微电网调度模型进行仿真验证,展示了该算法在处理复杂多目标优化问题上的有效性优越性。同时,文档还提供了丰富的科研资源支持,涵盖智能优化算法、机器学习、路径规划、电力系统管理等多个领域,配套网盘资料便于读者复现拓展研究。; 适合人群:具备一定电力系统或优化算法基础,从事科研工作的研究生、高校教师及工程技术人员,尤其适合关注微电网调度、智能优化算法应用的研究者。; 使用场景及目标:①掌握NSDBO等智能优化算法在多目标问题中的设计实现方法;②学习微电网多目标调度建模Matlab仿真技术;③复现论文结果并开展算法改进对比研究; 阅读建议:建议结合提供的Matlab代码和网盘资源,逐步调试运行算法程序,重点关注算法流程、目标函数构建仿真结果分析,同时可参考文中提及的其他优化方法进行横向对比,深化对智能优化在电力系统中应用的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值