android中开启子线程

有些东西是需要总结下了。。。在面试过程中,被问到,如何开启一个子线程的时候。。。脑子里忘得只剩new Thread对象了,还有就是没有意识到自己是否在主线程中做了耗时操作,这些都是很致命的。兜兜转转,还是java基础差惹的祸,咱给补上。

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开辟子线程就只有这两种方式了。

activity中的示例代码

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的方式还是比较常规的方式

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值