android 开启子线程方法,android中开启子线程
AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: android.os.NetworkOnMainThreadException
如果你在主线程中做了一些耗时操作,那么会报这个错误android.os.NetworkOnMainThreadException
解决这个错误的的方法很简单,就是把这个方法,移动到你new出来的Thread类中就可以了,这也是人们常说的不要在主线程中做一些耗时操作,犯了大忌。。。。
在Android启动线程和JAVA一样有两种方式,一种是直接创建Thread类对象,然后调用start方法,也就是一般写一个自己自定义的类来继承Thread类,然后调用start方法启动,至于你要问run()方法和start()方法有什么区别。。。我只能无语了,run()方法中是写你这个Thread中具体要做的事情(一般是耗时操作等必须写在这里面),start()方法是启动这个线程,两个方法是不同的概念。另外一种方式就是实现Runnable接口,然后把实现了Runnable接口的子类对象传递给Thread类,同样要start这个线程。总之都是需要创建Thread对象,然后调用Thread类的start方法启动线程。区别就是,一个是直接创建Thread对象,然后extends(继承)了Thread类,另外一个是需要implement(实现)了Runnable接口对象作为创建Thread对象的参数。Android开辟子线程就只有这两种方式了。
package com.example.viewpagerdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
// 1、直接new 一个线程类,传入参数实现Runnable接口的对象(new Runnable),相当于方法二
new Thread(new Runnable() {
@Override
public void run() {
// 写子线程中的操作
}
}).start();
// 2、通过实现Runnable接口
Thread t = new Thread(new myRunnable());
t.start();
// 3、通过继承线程类实现
new myThread().start();
}
// Thread是一个类,必须继承
public class myThread extends Thread {
@Override
public void run() {
super.run();
// 写子线程中的操作
}
}
// Runnable是一个接口,需要实现
public class myRunnable implements Runnable {
@Override
public void run() {
// 写子线程中的操作
}
}
}
另外一个我觉得是坑的地方就是android中独有的Handler消息机制,Android主要的考虑到更新界面的问题,一般情况下,更新界面都是在UI主线程中更新的,意思就是只能在当前Activity创建的时候会自动生成的UI主线程中进行UI的更新,那么,我们能想到的方式就是,拿到主线程,进行UI的更新,貌似谷歌3.0还是多少就抛弃了这种方式,这样很容易阻塞UI主线程,程序很容易崩溃,通常这样联网耗时的工作需要开辟另外一个线程的,这样就不会影响主程序了。归根到底,这是不是更Android中的单继承有关,所以android中提供了Handler这个概念。举个例子:在下载文件时候我们需要进度条显示下载进度,界面需要不断更新,就需要用到Handler了。一般实现这种方式需要用到Thread+Handler的方式,隔多少秒在子线程中获取下载了多少的数据,在子线程中获取到Message对象(两种方式1、Message msg = Message.obtain();2、Message msg=new Message();建议用第一种方式,不采用new的方式,就是在当前的消息线程池中获取Message这个对象),然后通过Handler的sendMessage()方法发送得到的下载的数据(如果你对Intent中数据的传递熟悉的话,就应该知道Bundle对象。。。数据包,我们老师教的时候就把它类比成快递的打包然后再拆分。。。那就更别说int,String这些单数据类型了),当你调用了sendMessage方法后,Handler就会回调Handler中的 HandlerMessage方法,在这个方法中你可以对数据包进行拆分,对控件进行赋值。。。相当于通知主线程更新界面(这个方法,在你new Handler()这个方法中会要求重写这个方法HandlerMessage)。可以可以,写了一遍后,我自己都觉得清楚了一些。。。。。Thread+Handler的方式还是比较常规的方式
————————————————
版权声明:本文为CSDN博主「trebleZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z_zt_t/article/details/51890801
android 开启子线程方法,android中开启子线程相关推荐
- android颜色值的表示方法android:background=#FFFFFFFF的意思
android颜色值的表示方法 android:background="#FFFFFFFF"的意思 Android中的颜色值是通过红(Red).绿(Green).蓝(Blue)三原 ...
- vue 子组件调用父组件方法、值(父传子);父组件调用子组件方法、值(子传父)。
一.子组件调用父组件方法(父传子-方法) 场景:子组件是弹出框组件.当点击确定时,将新增的值增加到父组件的列表.就要调用父组件的getLIst()方法. 代码: //父组件 利用@子组件方法名=&qu ...
- xpwifi热点设置android,教你在XP电脑中开启设置WiFi热点使用的步骤
对于系统中网络的连接问题是最重要的,那在处理不同的错误的情况中,对于无线网络的设置也就是我们说的WiFi的使用也是会遇到问题的,那在操作的时候对于电脑中是怎么实现设置WiFi热点的的,对于这个问题今天 ...
- android的handler使用方法,android中handler用法总结
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...
- android 矢量图片使用方法,Android中的矢量图
概述 VectorDrawable是通过XML文件中的一系列点,线和曲线及其相关颜色信息定义的. 使用VectorDrawable的主要优点是图像可扩展性. 它可以缩放而不损耗显示质量,这意味着相同的 ...
- android toolbar的使用方法,Android中Toolbar的基本使用
Android的标题栏是很重要的一个模块,App是否易用很大一部分要看标题栏.写这个博客的时候刚发现谷歌推出了一种新的标题栏实现方式. 它相对于以前的ActionBar来说,最大的变化是开发者可以在标 ...
- android 设置全屏方法,Android中设置全屏的方法
在开发中,我们经常需要把我们的应用设置为全屏,这里有两种方式: 一是在代码中设置; 二是在配置文件中设置 一. 在代码中设置 public class BaseActivity extends Act ...
- YII 开启URL伪静态方法(yii中urlManager匹配和注意点)
Yii高性能PHP框架 Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP ...
- android的反调试方法,Android平台融合多特征的APP反调试方法与流程
本发明涉及Android平台融合多特征的APP反调试方法,属于计算机与信息科学技术领域. 背景技术: 应用程序本身并不具备反调试的功能,但是动态调试是动态分析应用逻辑.动态脱壳等攻击方式所采取的必要手 ...
最新文章
- Firefox做默认浏览器,点击QQ面板连接(QQ邮箱,空间),延迟很久很久才打开网页(Firefox 浏览器 延迟 打开 点击没反应)...
- window系统下安装TensorFlow-gpu
- 自动论文生成器 python_Python生成器常见问题及解决方案
- 昨天安装复习中遇到的问题小结
- NSString 截取字符串
- 编程实战:如何管理代码里的常量
- Python+tkinter实现任意多层级关系的组合框
- shell脚本如何显示所执行的每一条命令
- 计算机专业学生专利,2019.6 电子与计算机工程学院学生喜获三项国家专利
- 屏蔽csdn右下角广告插件
- java计算base64图片大小
- 四则运算生成程序(基于控制台)
- QoS(Quality of Service),中文名为服务质量。
- 高考失利之后,属于我的大学本科四年
- pycharm批量注释
- PHP生成PDF库(TCPDF)参数说明
- 一条简单 SQL 执行耗时超 1000ms,问题解决全过程!
- 闭关修炼,看了老大的博客,才发现自己是多么的技术低,原来我就达到06年的他
- 321影音代码(万能播放器)源码
- Mysql 忘记root密码的完美解决方法