上几篇博文给大家介绍有关listView使用方法( GridView和Gallery和listView类似,我也写2个有关的例子等会上传到我的上传,大家有需要的可以去下载。),接下来我开始为大家介绍安卓里面又一项很重要的技术--多线程的使用。(本来想先介绍四大组件的,但是后来想想介绍完线程就可以用listView结合线程做个下载项目,所以先介绍线程)
1:ANR的介绍
(1):ANR异常指的是当我们执行的一部分代码需要耗时操作(例如从网络下载数据,查找数据库等)的时候,由于都是在主线程操作,这时候我们就需要等待耗时操作结束才能执行其他主线程命令,这样就会出现界面无响应的情况。安卓系统规定如果耗时操作超过10秒的话就会报ANR异常。如下图
2:解决ANR异常
(1):由于都是在主线程进行,学过java的都知道这时候我们就刚使用线程来将耗时操作放在子线程,这样就不会影响用户主线程操作别的功能。现在我给大家做个小例子。设置一个按钮和文本框,当点击按钮时候开始下载,等下载结束时候文本内容变为“下载完成”。耗时操作代码如下(那些找到控件对象的代码我就不写了大家可以到我的下载下载完整代码看)
//开始下载后设置文本为"下载中" mTextView.setText("下载中"); //写个线程的匿名类执行耗时操作 new Thread(){ public void run() { try { sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } //下载完成后改变文本内容 mTextView.setText("下载完成"); }; }.start();
(2):Handler类的使用
当我们执行代码后发生的异常,如下图
异常提示说我们只能在main线程操作UI,这时候怎么通知主线程我们已经下载可以进行继续下一步操作?其实很简单,那就是使用Hander类使用。首先我们写个类(MyHander)继承handler然后重写handleMessage()方法,然后定义一个MyHander类的成员变量。具体代码如下
private MyHandler handler = new MyHandler(); class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }
当我们执行完耗时操作的时候调用handler类的sendMessage()方法将我们所需要的信息传递出去,具体代码如下(这里注意了msg对象不能设置成成员变量,每次传递消息都要new一个msg对象,否则会出问题)
Message msg = new Message(); msg.obj = "下载完成"; handler.sendMessage(msg );
刚才我们不是写了个Myhander类,在handleMessage方法就将我们所传的信息对象返回,于是我们取出信息对象的内容并把文本内容改变(),这样就大功告成(HanderMessage是在main线程里处理UI控件所以不会报异常大家可以在方法里面打个日志)
class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String result = (String) msg.obj; mTextView.setText(result); } }
以上就是今天我为大家介绍的内容,稍后我会吧完整的代码上传到我的下载,需要的可以去下载。名字为“安卓多线程#1”
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。