异步处理(Handler)线程(ThreadRunnable)定时器(Timer)Wifi管理(WifiManagerWifiInfo)

本文主要是介绍异步处理(Handler)线程(ThreadRunnable)定时器(Timer)Wifi管理(WifiManagerWifiInfo),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Handler.post(Runnable)方法的执行原理:http://blog.csdn.net/vampire0072009/article/details/43273375


Java中Runnable和Thread的区别:http://developer.51cto.com/art/201203/321042.htm


定时任务:Java中Timer和TimerTask的使用 :http://batitan.iteye.com/blog/253483


java.util.Timer浅析:http://www.cnblogs.com/jinspire/archive/2012/02/10/2345256.html


WifiManager解析:http://blog.csdn.net/hb8676086/article/details/50929953


代码分析

import android.app.Activity;
import android.content.Intent;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.util.Log;
import com.android.internal.telephony.Phone;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.content.Context;
import android.content.res.Resources;import android.view.Window;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.net.wifi.WifiInfo;import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.List;
import java.util.concurrent.Exchanger;import android.os.SystemProperties;public class WifiMAC extends EmActivity {Button okButton;TextView mContent;View btn_pass;String wifimac="waiting...";Button scan;boolean closewifi=false;WifiInfo wifiInfo=null;int i=0;Timer timer=null;private WifiManager mWifiManager;private static final String LOG_TAG="EMODE_WIFIMAC";private boolean DBG=true;protected void log(String msg){if(DBG) Log.e(LOG_TAG,msg);}final Handler mHandler=new Handler();//这个Handler对象在主线程中进行UI更新//这里虽然重写了接口Runnable的run方法但是并没有开启新线程,// 这个对象将会通过调用Handler.post(Runnable)方法,在主线程中执行updateUI操作final Runnable mUpdateResults=new Runnable() {@Overridepublic void run() {updateUI();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.em_wifimac);mContent=(TextView)findViewById(R.id.imei_content);mContent.setText(getString(R.string.wifi_mac)+wifimac);//开启一个新线程用来获取wifiMAC地址,因为WIFI的启动比较耗时,最好放到非主线程中执行//这里通过mHandler.postDelayed(mUpadateResults,5000);在主线程中更新UInew Thread(){public void run(){getWifiMAC();mHandler.postDelayed(mUpdateResults,5000);}}.start();scan=(Button)findViewById(R.id.scan);scan.setText(R.string.btn_text_scan);scan.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();intent.setAction("android.settings.WIFI_SETTINGS");//打开系统wifi设置页面startActivity(intent);}});scan.setVisibility(View.GONE);okButton=(Button)findViewById(R.id.Button01);okButton.setOnClickListener(new Button.OnClickListener(){public void onClick(View v){finish();//结束活动}});okButton.setText("OK");}@Overrideprotected void onResume() {if(btn_pass==null){View dv=getWindow().getDecorView();btn_pass=dv.findViewById(R.id.btn_succ);btn_pass.setVisibility(View.GONE);}super.onResume();}void getWifiMAC(){mWifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);if(!mWifiManager.isWifiEnabled()){//如果WIFI不使能mWifiManager.setWifiEnabled(true);//使能wificlosewifi=true;try{//进行线程操作时需要捕获InterruptedException异常Thread.sleep(10000);//当前线程休眠10秒}catch (InterruptedException e){e.printStackTrace();}}//WifiManager的操作需要权限android.permission.CHANGE_WIFI_STATEwifiInfo=mWifiManager.getConnectionInfo();if(wifiInfo==null){try{timer=new Timer();TimerTask task=new TimerTask() {@Overridepublic void run() {try{Thread.sleep(1000);//当前线程休眠1秒wifiInfo=mWifiManager.getConnectionInfo();//获取wifi信息,需要权限i++;}catch (Exception e){e.printStackTrace();}}};timer.schedule(task,1000);//TimerTask又开启了一个新线程获取wifi信息}catch (Exception e){e.printStackTrace();}if(wifiInfo==null && i>5){//如果获取五次wifi信息后信息仍为空timer.cancel();//取消定时器任务wifimac=getString(R.string.unknow);}if(wifiInfo!=null){wifimac=wifiInfo.getMacAddress();timer.cancel();}}else{wifimac=wifiInfo.getMacAddress();}}private void updateUI(){mContent.setText(getString(R.string.wifi_mac)+wifimac);List<ScanResult> list=mWifiManager.getScanResults();int size=list.size();TextView tv_list=(TextView)findViewById(R.id.device_list);for(int i=0;i<size;i++){tv_list.append(list.get(i).SSID+"\n");}if(size>0){if(btn_pass==null){View dv=getWindow().getDecorView();btn_pass=dv.findViewById(R.id.btn_succ);}btn_pass.setVisibility(View.VISIBLE);}}@Overrideprotected void onDestroy() {super.onDestroy();Log.e("wifi","ondestroy begin");if(closewifi){mWifiManager.setWifiEnabled(false);}}
}



这篇关于异步处理(Handler)线程(ThreadRunnable)定时器(Timer)Wifi管理(WifiManagerWifiInfo)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099313

相关文章

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避