• Android线程之并发处理


      上一篇为大家介绍了关于Looper的简单知识,本篇我们介绍一下多线程的并发处理,我们知道Handler通过sendMessage()发送的消息,首先发送给了Looper,存入Looper的消息栈,之后从新发送给Handler对象,Handler对象通过handMessage()方法处理消息。这里就很容易出现空指针异常,下面我们就一起看一下这段代码:

    public class MainActivity extends Activity {
        
        class Mythread extends Thread{
            private Handler handler;
            private Looper looper;
            @Override
            public void run() {
    
                Looper.prepare();//创建一个Looper对象
                looper = Looper.myLooper();
                handler = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        System.out.println("子线程:"+Thread.currentThread());
                    }
                };
                Looper.loop();//通过这个方法循环处理方法
                
            }
        };
    
        private Mythread thread;
        private Handler secondHandler;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            thread = new Mythread();
            thread.start();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            thread.handler.sendEmptyMessage(1);//在子线程中处理
            
            secondHandler = new Handler(thread.looper){
                @Override
                public void handleMessage(Message msg) {
                    System.out.println(msg);
                }
            };
            
            secondHandler.sendEmptyMessage(1);
            
        }
    
    }

      这是就会出现空指针异常,因为当我们的SecondHandler创建时,如果thread.looper对象还未创建,就会出现这个异常。那如何防止这个异常呢?谷歌在设计Android时已经为我们考虑到了这一点,这里我们将使用HandlerThread来处理这种多线程并发的问题。

    /**
     * 使用HandlerThread处理多线程并发处理时出现空指针问题
     */
    public class SecondActivity extends Activity {
        
        private HandlerThread handlerThread;
        private Handler handler;
        private TextView text;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //创建一个TextView
            text = new TextView(this);
            text.setText("Helloword");
            setContentView(text);
            
            //创建一个Handler的线程对象
            handlerThread = new HandlerThread("handler thread");//为当前的线程起一个名字
            handlerThread.start();//启动线程
            handler = new Handler(handlerThread.getLooper()){
                @Override
                public void handleMessage(Message msg) {
                    System.out.println("current:"+Thread.currentThread());
                }
            };
            handler.sendEmptyMessage(1);
        }
        
    }
  • 相关阅读:
    MySQL查看视图
    MySQL创建视图(CREATE VIEW)
    Mysql视图
    Snipaste使用教程
    Mysql全文检索
    MySQL中MyISAM和InnoDB
    MySQL卸载注意事项
    MySql免安装配置(Windows)
    验证用户名密码:Servlet+Maven+Mysql+jdbc+Jsp
    使用response下载文件
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4466620.html
Copyright © 2020-2023  润新知