Android子线程访问网络

之所以Google在Android4.0之后,禁止主线程访问网络,是为了更好的用户体验。也就是主线程是为了界面的显示。如果主线程访问网络,就会造成“卡顿”。也就是对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程就会出现假死的现象,产生很不好的用户体验。所以,默认的情况下如果直接在主线程中访问就报出了这个异常,名字是NetworkOnMainThreadException。主线程操作5s的相应时间,就会关闭该线程,所以将耗时很大的操作放在子线程。

解决该问题的办法

1. 独立线程

2. 异步线程AsyncTask

3. StrictMode修改默认的策略

1) 独立线程的办法

启动一个新线程的代码:
new Thread(){

@Override

public void run() {

Dosomething();

handler.sendEmptyMessage(0);

}

}.start();

此处我们重写了线程类的run方法,执行Dosomething. 在里面还有个handler对象,这又涉及到了跨线程修改UI元素内容的问题。在java中是不允许跨线程修改UI元素的,如我们在新启动的线程中想去修改UI主线程中TextView的文本时,会报错误的。如果想做这样的操作,我们就得借助Handler这个类来实现。 关于这个handler类的用法,我们单独的再来写一篇博客进行介绍。

2) 异步调用的方法 AsyncTask

这里关于AsyncTask 介绍的文章不错, 详细情况看作者的介绍吧  
http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html#2824345
接下来也将会有一篇博客专门介绍 关于更新主线程UI线程的所有办法

3) StrictMode修改默认的策略

在我们的Activity类的onCreate方法中,设置如下规则:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

这样也可以解决这个问题

关于StrictMode的具体介绍,请看另一个博客介绍的非常详细:

http://hb.qq.com/a/20110914/000054.htm

时间: 2024-08-11 09:48:09

Android子线程访问网络的相关文章

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

Android子线程真的不能更新UI么

Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) Handler 为什么呢?在子线程中就不能操作UI么? 当一个程序第一次启动的时候,Android会同时启动一个对应的主线程,这个主线程就是UI线程,也

android子线程中更新UI的方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //

Android子线程更新主界面

学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler技术,闲话不多说了! 每一个做android的人都知道,android的内存可谓是存M存金啊!然后我们自然知道,而且Google在设计的时候也充分的考虑到了这一点,所以,我们的UIThread里面一般不做耗时的工作,比如请求网络,比如执行一些比较耗时的逻辑,比如比如加载图片,比如,哦,暂时只碰到过这

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

Android 子线程测试

private volatile boolean mStopped = false; private int i; TextView tv1; TextView tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); tv1 = (TextView) findVie

android 子线程真的不能更新ui吗

在实际的开发中,子线程肯定是不能更新ui的,但是在测试的代码中,我们可以实现子线程中更新ui的功能,例如:一个textview 在oncreate生命周期方法中进行findviewbyid 然后紧接着写一个线程,在线程中直接对这个textview进行settext,你就会发现奇迹竟然就那么发生了,竟然真的更新了ui,而app竟然没有cresh掉,顿时就惊呆了 然后分别尝试在onstart onresume 方法中进行子线程更新ui的操作,竟然都可以更新,但是此时有一个地方需要注意,当我们程序的o

老问题:Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 S

Android 子线程 更新 UI 界面 总结

package com.jrhcode.morethreadtest; import java.util.concurrent.Executors; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.Menu; import android.widget.TextView; import