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中开启子线程相关推荐

  1. android颜色值的表示方法android:background=#FFFFFFFF的意思

    android颜色值的表示方法 android:background="#FFFFFFFF"的意思 Android中的颜色值是通过红(Red).绿(Green).蓝(Blue)三原 ...

  2. vue 子组件调用父组件方法、值(父传子);父组件调用子组件方法、值(子传父)。

    一.子组件调用父组件方法(父传子-方法) 场景:子组件是弹出框组件.当点击确定时,将新增的值增加到父组件的列表.就要调用父组件的getLIst()方法. 代码: //父组件 利用@子组件方法名=&qu ...

  3. xpwifi热点设置android,教你在XP电脑中开启设置WiFi热点使用的步骤

    对于系统中网络的连接问题是最重要的,那在处理不同的错误的情况中,对于无线网络的设置也就是我们说的WiFi的使用也是会遇到问题的,那在操作的时候对于电脑中是怎么实现设置WiFi热点的的,对于这个问题今天 ...

  4. android的handler使用方法,android中handler用法总结

    一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...

  5. android 矢量图片使用方法,Android中的矢量图

    概述 VectorDrawable是通过XML文件中的一系列点,线和曲线及其相关颜色信息定义的. 使用VectorDrawable的主要优点是图像可扩展性. 它可以缩放而不损耗显示质量,这意味着相同的 ...

  6. android toolbar的使用方法,Android中Toolbar的基本使用

    Android的标题栏是很重要的一个模块,App是否易用很大一部分要看标题栏.写这个博客的时候刚发现谷歌推出了一种新的标题栏实现方式. 它相对于以前的ActionBar来说,最大的变化是开发者可以在标 ...

  7. android 设置全屏方法,Android中设置全屏的方法

    在开发中,我们经常需要把我们的应用设置为全屏,这里有两种方式: 一是在代码中设置; 二是在配置文件中设置 一. 在代码中设置 public class BaseActivity extends Act ...

  8. YII 开启URL伪静态方法(yii中urlManager匹配和注意点)

    Yii高性能PHP框架 Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP ...

  9. android的反调试方法,Android平台融合多特征的APP反调试方法与流程

    本发明涉及Android平台融合多特征的APP反调试方法,属于计算机与信息科学技术领域. 背景技术: 应用程序本身并不具备反调试的功能,但是动态调试是动态分析应用逻辑.动态脱壳等攻击方式所采取的必要手 ...

最新文章

  1. Firefox做默认浏览器,点击QQ面板连接(QQ邮箱,空间),延迟很久很久才打开网页(Firefox 浏览器 延迟 打开 点击没反应)...
  2. window系统下安装TensorFlow-gpu
  3. 自动论文生成器 python_Python生成器常见问题及解决方案
  4. 昨天安装复习中遇到的问题小结
  5. NSString 截取字符串
  6. 编程实战:如何管理代码里的常量
  7. Python+tkinter实现任意多层级关系的组合框
  8. shell脚本如何显示所执行的每一条命令
  9. 计算机专业学生专利,2019.6 电子与计算机工程学院学生喜获三项国家专利
  10. 屏蔽csdn右下角广告插件
  11. java计算base64图片大小
  12. 四则运算生成程序(基于控制台)
  13. QoS(Quality of Service),中文名为服务质量。
  14. 高考失利之后,属于我的大学本科四年
  15. pycharm批量注释
  16. PHP生成PDF库(TCPDF)参数说明
  17. 一条简单 SQL 执行耗时超 1000ms,问题解决全过程!
  18. 闭关修炼,看了老大的博客,才发现自己是多么的技术低,原来我就达到06年的他
  19. 321影音代码(万能播放器)源码
  20. Mysql 忘记root密码的完美解决方法

热门文章

  1. 如何设计手机端banner图【电商小白】
  2. 你每天走的步数,手机是怎么算出来的?
  3. android 蓝牙低功耗(BLE)非常棒的工具类,获取小米手环的步数
  4. NoSQL 在腾讯应用实践
  5. 【宝塔邮局管理器】使用教程、Email配置
  6. 总结在java编程中的经验教训
  7. Opensea空投详细专业教程
  8. UndoManager教程
  9. 从一到无穷大:科学中的事实和臆测 (G. 伽莫夫 著)
  10. 哥德尔不完全性定理探索数学边界