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中开启子线程)