当前位置: 编程技术>移动开发
本页文章导读:
▪libGDX开发课程(三)-中文显示与 libGDX开发教程(三)--中文显示与…
本文使用的libgdx是0.98版本,可能和最新版有一些不同地方。全文内容仅供参考。
Libgdx虽然是由美国人MarioZechner(即BadlogicGames)写的开源引擎,由于Libgdx底.........
▪ 移栽u-boot到gec210 移植u-boot到gec210第一步:在顶层Makefile 中添加板级目标
gec210_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x gec210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
第二步.........
▪ androi之Service+Broadcast+Timer+ui【经过绑定服务、自定义回调接口判断网络连接】 androi之Service+Broadcast+Timer+ui【通过绑定服务、自定义回调接口判断网络连接】 最近项目要定时从服务器获取某些信息,通过研究来总结一下下【我以定时判断网络状态为例来阐述】
.........
[1]libGDX开发课程(三)-中文显示与
来源: 互联网 发布时间: 2014-02-18
libGDX开发教程(三)--中文显示与…
本文使用的libgdx是0.98版本,可能和最新版有一些不同地方。全文内容仅供参考。
注意:如果你要使用的字,只能是.fnt文件里面存在的文字,否则是显示不出来的.比如,我文件里面有“奋斗小土豆”几个字,那么我可以在程序输出的时候写出这几个字,但是我要是想输出“杜甫很忙”这4个字,因为编辑文件里面没有这几个字,那么就显示不出来。
PS:为什么要加载fnt文件?.fnt文件是做什么用的呢?
答:由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的。但是libgdx中的汉字都是通过贴图的方式显示的,我们用记事本打开Potato.fnt文件,里面显示的部分内容(如下图),同时对照.png图片来参考下,可以发现可以很明显看出,libgdx的文字绘制是根据fnt文件获取对应文字的在png中的坐标位置,然后截取图片的相应部分进行绘制。
下面我们简单的介绍下用代码来实现一下,我们就画出“奋斗小土豆丶”这几个字,我们依旧使用之前的HelloWorld项目,修改代码如下:
Libgdx虽然是由美国人MarioZechner(即BadlogicGames)写的开源引擎,由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的,在libgdx中的汉字都是通过贴图的方式显示,使用BitmapFont和SpriteBatch组合来完成文字的绘制,构造BitmapFont时需要一个描述文字构成的fnt文件,和一个提供文字图片的png文件。因此显示中文,归根结底就是读取一个包含中文信息的.fnt文件和相应的.png文件并展示出来的问题。
Libgdx游戏引擎(1群):187378034
Libgdx游戏引擎(2群):148848483
Libgdx游戏引擎(3群): 79168470
Libgdx国内交流论坛
:www.libgdx.net
1.Hiero工具的使用
如何得到一个“.fnt”和“相应的.png”的文件呢?作者(MarioZechner)给我们提供了一个非常好用的s工具:Hiero。
下载地址:https://code.google.com/p/libgdx/downloads/list
下载结束后,双击hiero.jar文件开,打开后,我们可以看到Hiero的一些基本功能,相比来说作者做的还是比较简单易懂的。从界面上知道,它包括很多选项,像可以制作特效、改变背景颜色、设置内间距等等,右侧还有作提供给我们的做好的字体效果点击Add按钮就可以添加。这里土豆做了一张图片,将它的功能简单的标注了下,这就不详细介绍了.
如下图:
编辑好你要写的文字后,点File—Saveas BMFontFiles,生成两个文件(如下图),将它们拷贝到asserts文件夹。
注意:如果你要使用的字,只能是.fnt文件里面存在的文字,否则是显示不出来的.比如,我文件里面有“奋斗小土豆”几个字,那么我可以在程序输出的时候写出这几个字,但是我要是想输出“杜甫很忙”这4个字,因为编辑文件里面没有这几个字,那么就显示不出来。
PS:为什么要加载fnt文件?.fnt文件是做什么用的呢?
答:由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的。但是libgdx中的汉字都是通过贴图的方式显示的,我们用记事本打开Potato.fnt文件,里面显示的部分内容(如下图),同时对照.png图片来参考下,可以发现可以很明显看出,libgdx的文字绘制是根据fnt文件获取对应文字的在png中的坐标位置,然后截取图片的相应部分进行绘制。
2.BitmapFont类
API介绍:呈现位图字体,包括2个文件:一个图像文件textureregion,包含符号在anglecodebmfont文本格式,描述了每个字形是图像文件。文本是使用一个SpriteBatch画。
功能用途:渲染静态文本,同时可以设置文字颜色,文字大小等。
使用方法:我们可以手动设置文字大小和颜色以及旋转,这里使用函数设置是可以的,在Hiero里面也是可以设置的,同学们可以自行选择哪种方法设置,new()里面的false是管理翻转的,如下图:
下面我们简单的介绍下用代码来实现一下,我们就画出“奋斗小土豆丶”这几个字,我们依旧使用之前的HelloWorld项目,修改代码如下:
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
font.setColor(0.5f, 0.4f, 0.6f, 1);// 设置颜色
font.setScale(1.0f);// 字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶", 200, 160);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
font.setColor(0.5f, 0.4f, 0.6f, 1);// 设置颜色
font.setScale(1.0f);// 字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶", 200, 160);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
输出效果图:
(1)文字单行显示
文字单行显示很简单,font.draw()就可以,下面我介绍下font中持有的draw方法,解释下里面的参数是做什么用的。
方法:draw(SpriteBatch spriteBatch,,java.lang.CharSequence str, float x, float y, int start, int end)
第一个参数是SpriteBatch类的对象,这里不多解释了。
第二个参数是字符串,也你要输出的中文字符,例如刚才我们写的“奋斗小土豆丶”这个就是第二个对应的字符。
第三个和第四个参数(即float x,float y),它们是绘制字中文字符的起点坐标,遵循普通坐标系(左下角起点)。
第五个参数和第六个参数,是设置从第几个字符开始输出,到第几个字符结束,比如我们要输出“小土豆”这3个字就将start改为2,end改为5,这里面第一个字符默认编码是0而不是1,请牢记。
下面给大家用代码演示,代码如下:
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
//font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
//font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶", 200, 160, 2, 5);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
//font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
//font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "奋斗小土豆丶", 200, 160, 2, 5);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
效果图:
(2)文字换行显示
文字进入可以写出了,但是有的同学的文字比较多,一行根本写不完。BitmapFont类中有一个drawMultiLine()方法帮我们解决了多行显示的问题,我们只需要在中文字符中加入换行符(\n)即可,而且它还是自动识别的,非常简单。
方法:drawMultiLine(SpriteBatch spriteBatch, java.lang.CharSequence str, float x, float y, float alignmentWidth,BitmapFont.HAlignment alignment)
这里面前几个参数我都详细介绍了,最后面2个 “float alignmentWidth,BitmapFont.HAlignment alignment” 是指文字的对齐方式,有LEFT、RIGHT、CENTER几种方式。其中,LEFT的绘制原点是左上角、RIGHT的绘制原点是由上角、CENTER的绘制原点是每行文字中心,向两边展开。
float alignmentWidth,,对LEFT不起作用,只对RIGHT和CENTER起作用,对RIGHT来说就相当于把绘制原点平移alignmentWidth的宽度,对CENTER来说相当于平移绘制原点平移alignmentWidth/2的宽度。
下面给大家用代码演示,代码如下:
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
//font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
//font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "------奋斗小土豆丶", 200, 160);
font.drawMultiLine(batch, "爱情来得快,去的也快,\n只有猪肉卷是永恒的",
Gdx.graphics.getWidth() / 5, 0.8f * Gdx.graphics.getHeight());
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class HelloWorld implements ApplicationListener {
public SpriteBatch batch;
BitmapFont font;
@Override
public void create() {
font = new BitmapFont(Gdx.files.internal("data/Potato.fnt"),
Gdx.files.internal("data/Potato.png"), false);
//font.setColor(0.5f,0.4f,0.6f,1);//设置颜色
//
//font.setScale(1.0f);//字体比例大小
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "------奋斗小土豆丶", 200, 160);
font.drawMultiLine(batch, "爱情来得快,去的也快,\n只有猪肉卷是永恒的",
Gdx.graphics.getWidth() / 5, 0.8f * Gdx.graphics.getHeight());
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
效果图:
写在最后,有关于中文显示的基本方法今天就介绍到这里了,下一篇是也是关于libgdx框架中文显示的博文,我会介绍下《TTF字库的使用》。如果大家有什么问题可以加我QQ:316344618,一起讨论下。。PS:今天写的比较仓促,有很多准备不充分的地方,希望大家能多给予指点,帮助修改完善。
------------奋斗小土豆丶
2013年
4 月 10 日
[2] 移栽u-boot到gec210
来源: 互联网 发布时间: 2014-02-18
移植u-boot到gec210
第一步:在顶层Makefile 中添加板级目标
第二步:按照u-boot的模版要求,增加相应的板级目录,并添加对应的代码: 增加board/samsung/gec210目录(将smdkc110复制并改名成gec210) 将gec210目录中的文件进行改名:smdkc110.c --> gec210.c 将Makefile中的smdkc110改成gec210
总结
第一步:在顶层Makefile 中添加板级目标
gec210_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x gec210 samsung s5pc110 @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
第二步:按照u-boot的模版要求,增加相应的板级目录,并添加对应的代码:
第三步:添加板级配置.h文件
就将 include/configs/smdkv210single.h 复制生成 gec210.h
第四步:添加cpu初始化代码
如果需要,增加相应的CPU初始化代码(由于当前gec210使用的是s5pc11x,已存在,则忽略)
第五步:修改Makefile 指定交叉工具链:
145行 CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-第六步:编译
make cp u-boot /tftpboot
1、拿到一块新板子,先确认其CPU架构
2、核实u-boot中对该CPU的支持(查看cpu目录及board目录)
3、核实Makefile中与其对应的目标(如果有就加载,没有就添加)
4、新增该板子的外设功能,在board目录的对应c程序中增加(需要考虑效率跟加载时间,尽量保存简洁)
5、加载正确的板级配置 (make xxx_config)
6、编译uboot
2、核实u-boot中对该CPU的支持(查看cpu目录及board目录)
3、核实Makefile中与其对应的目标(如果有就加载,没有就添加)
4、新增该板子的外设功能,在board目录的对应c程序中增加(需要考虑效率跟加载时间,尽量保存简洁)
5、加载正确的板级配置 (make xxx_config)
6、编译uboot
---------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------
以上全部是个人观点,如有错误请指正
[3] androi之Service+Broadcast+Timer+ui【经过绑定服务、自定义回调接口判断网络连接】
来源: 互联网 发布时间: 2014-02-18
androi之Service+Broadcast+Timer+ui【通过绑定服务、自定义回调接口判断网络连接】
最近项目要定时从服务器获取某些信息,通过研究来总结一下下【我以定时判断网络状态为例来阐述】
原理:
我们定义一个Service,在该Service中设置一个定时器Timer,通过TimerTask的策略来检查当前应用的网络连接状态,关键是在该Service需要自定义一个回调接口用于向我们的Activity来回调发送网络状态,然后通过Bind来绑定当前的Service,在绑定成功之后得到回调信息
代码:
Service类
package com.example.androidtimerdemo; import java.util.Timer; import java.util.TimerTask; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class NetService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return netBind; } //上下文 Context context; //网络连接状态 boolean isConntect = true; //定时器 Timer timer = new Timer(); @Override public void onCreate() { // 注册广播 检查网络状态 IntentFilter filter = new IntentFilter(); filter.addAction( ConnectivityManager.CONNECTIVITY_ACTION ); registerReceiver( receiver, filter ); Log.i( "tag", "service**"+Thread.currentThread().getId() ); super.onCreate(); } //网络检查广播接受者 private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // 启动定时任务 if (action.equals( ConnectivityManager.CONNECTIVITY_ACTION )) { //立即启动,每隔5秒执行一次Task Log.i( "tag", "receiver**"+Thread.currentThread().getId() ); timer.schedule( new NetTask( context ), 0, 5*1000 ); } } }; //具体的TimerTask实现类 class NetTask extends TimerTask { public NetTask(Context context1) { context = context1; } @Override public void run() { try { Thread.sleep( 20*1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (isConnectNet()) { isConntect = true; } else { isConntect = false; } Log.i( "tag", "run**"+Thread.currentThread().getId() ); if (onGetConnectState != null) { onGetConnectState.GetState( isConntect ); // 通知网络状态改变 } } } // 网络状态改变之后,通过此接口的实例通知当前网络的状态,此接口在Activity中注入实例对象 public interface GetConnectState { public void GetState(boolean isConnected); } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } /** * 判断是否连通网络 * @return */ private boolean isConnectNet() { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE ); NetworkInfo Mobile = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE ); NetworkInfo Wifi = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI ); if (Mobile.getState().equals( State.DISCONNECTED ) && Wifi.getState().equals( State.DISCONNECTED )) { return false; } return true; } //定义一个Bind类 private NetBind netBind = new NetBind(); class NetBind extends Binder { public NetService getNetService() { return NetService.this; } } //销毁广播、停止定时轮询 @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); timer.cancel(); unregisterReceiver( receiver ); } }
Activity:
package com.example.androidtimerdemo; import java.util.Timer; import java.util.TimerTask; import com.example.androidtimerdemo.MybindService.MyBind; import com.example.androidtimerdemo.NetService.GetConnectState; import com.example.androidtimerdemo.NetService.NetBind; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { TextView textView; TextView textView2; Button button1, button2; Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); activity = this; initView(); } private void initView() { textView = (TextView) findViewById( R.id.textView1 ); textView2 = (TextView) findViewById( R.id.textView2 ); button1 = (Button) findViewById( R.id.button1 ); button2 = (Button) findViewById( R.id.button2 ); button1.setOnClickListener( this ); button2.setOnClickListener( this ); } boolean is; @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: // 绑定服务 Log.i( "tag", "click**" + Thread.currentThread().getId() ); Intent intent = new Intent( activity, NetService.class ); boolean isTrue = bindService( intent, conn, Context.BIND_AUTO_CREATE ); is = isTrue; break; case R.id.button2: unBind(); default: break; } } private void unBind() { if (conn != null) { unbindService( conn ); } } private boolean conncetState = true; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { NetBind bind = (NetBind) service; NetService netService = bind.getNetService(); //此处回调 netService.setOnGetConnectState( new GetConnectState() { @Override public void GetState(boolean isConnected) { // TODO Auto-generated method stub if (conncetState != isConnected) { conncetState = isConnected; } Message msg = handler.obtainMessage(); if (conncetState) { msg.what = 1; } else { msg.what = 2; } handler.sendMessage( msg ); } } ); } }; Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: Toast.makeText( activity, "connect", 2000 ).show(); break; case 2: Toast.makeText( activity, "not", 2000 ).show(); default: break; } }; }; }PS:记得加网络权限哦
最新技术文章: