zoukankan      html  css  js  c++  java
  • Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类、Runnable类、Thread类之概念分析

    1.Handler类:

    Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理。Handler是执行在主线程(UI线程)。

    (2).使用Handler机制的原因:

    这是谷歌封装的一种更新UI机制和消息机制。假设不使用这个来更新UI和发送处理消息的时候就会抛出异常。

    (3).Handler的使用:

    Handler发送消息事实上是发送给自己。也就是说由自己来进行发送和处理。是由于Handler内部和Looper相关联。
    A.更新UI界面方面:

    package com.chengdong.su.handlerdemo;
    
    import android.app.Activity;
    import android.app.ActionBar;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.os.Build;
    
    /**
     * Handler用途1:更新UI界面中的组件
     * 
     * @author scd
     * 
     */
    public class MainActivity extends Activity {
        private ImageView mView;
    
        /** 数据源 */
        private int[] mImage = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3 };
        /** 图片所在的位置 */
        private int mIndex = 0;
        /** the object of the Handler */
        private Handler mHandler = new Handler();
        /** the object of the Runnable */
        private MyRunnable mRunnable = new MyRunnable();
    
        Runnable runnable = new Runnable() {
    
            @Override
            public void run() {
                mIndex++;
                mIndex = mIndex % 3;
                mView.setImageResource(mImage[mIndex]);
                // 再次调用Runnable对象,每隔一秒钟调用一次run()方法
                mHandler.postDelayed(runnable, 1000);
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_main);
            init();
            // 方法一:
            // mHandler.postDelayed(runnable, 1000);
            // 方法二:自己定义Runnable对象
            mHandler.postDelayed(mRunnable, 1000);
        }
    
        /***
         * init the view
         */
        private void init() {
            mView = (ImageView) findViewById(R.id.imageView1);
        }
    
        /**
         * 任务:业务逻辑
         * 
         * @author scd
         * 
         */
        private class MyRunnable implements Runnable {
            @Override
            public void run() {
                mIndex++;
                mIndex = mIndex % 3;
                mView.setImageResource(mImage[mIndex]);
                // 再次调用Runnable对象,每隔一秒钟调用一次run()方法
                mHandler.postDelayed(mRunnable, 1000);
    
            }
        }
    
    }
    

    B.消息处理方面:

    package com.chengdong.su.handlerdemo;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.widget.ImageView;
    
    /**
     * Handler用途1:更新UI界面中的组件
     * 
     * @author scd
     * 
     */
    public class MainActivity extends Activity {
        private String TAG = "MainActivity";
        private boolean Flag;
        private ImageView mView;
    
        /** the object of the Handler */
        private Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case 0: {
                    mView.setImageResource(R.drawable.ic_1);
                    Log.d(TAG, "消息1");
                    break;
                }
                case 1: {
                    mView.setImageResource(R.drawable.ic_2);
                    Log.d(TAG, "消息2");
                    break;
                }
                default:
                    break;
                }
    
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_main);
            init();
            if (Flag) {
                mHandler.sendEmptyMessage(0);
    
            } else {
    
                mHandler.sendEmptyMessage(1);
            }
    
        }
    
        /***
         * init the view
         */
        private void init() {
            mView = (ImageView) findViewById(R.id.imageView1);
        }
    
    }
    

    2.Runnable类:

    Runnable类是在UI线程中执行的,并没有创建新的线程。Runnable类是一个接口,通过覆写该类中的run()方法来实现业务逻辑需求。

    来更新UI界面中的组件。Runnable类仅仅是一个任务接口。是开启的线程的执行的任务。

    3.Thread类:

    实现Runnable类中的run()方法,Thread类调用该run()方法来执行新开启的线程,线程须要执行的内容都在该run()方法中来完毕。

    (1).start()方法:该方法启动一个线程。

    可是此线程是处于就绪状态,并没有执行。然后通过Thread系统类自己主动调用run()方法来完毕执行操作。

    (2).run()方法:该方法成为线程体。包括了要执行的线程的内容。run()方法执行结束,此线程终止。

    package com.chengdong.su.handlerdemo;
    
    import android.app.Activity;
    import android.app.ActionBar;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.os.Build;
    
    /**
     * 
     * @author scd
     * 
     */
    public class SecondActivity extends Activity {
        private String TAG = getClass().getSimpleName();
    
        private TextView mView;
        private MyThread mThread;
    
        private Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                Log.d(TAG, "Thread UI:" + Thread.currentThread().getId());
                mView.setText("111");
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
            System.out.println("--->UI线程:" + Thread.currentThread().getId());
            // 方法一:
            new Thread() {
                public void run() {
    
                    System.out
                            .println("--->新的线程:" + Thread.currentThread().getId());
    
                };
            }.start();
            // 方法二:
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out
                            .println("--->新的线程:" + Thread.currentThread().getId());
    
                }
            }).start();
    
        }
    
        private void init() {
            mView = (TextView) findViewById(R.id.textView1);
    
        }
    
        class MyThread extends Thread {
            public Handler mHandler2;
    
            @Override
            public void run() {
                // 创建一个消息载体对象
                Looper.prepare();
                mHandler2 = new Handler() {
                    public void handleMessage(android.os.Message msg) {
                        Toast.makeText(getApplicationContext(), "111", 1).show();
                    };
                };
                // 循环机制
                Looper.loop();
    
            }
        }
    
    }

    总结:
    Runnable()仅仅是一个任务的抽象,并非多线程。Thread.start()才是新开一个多线程。而且在新开的线程执行Thread。执行run()方法。多线程是Thread实现,跟Runnable没有太大关系。线程就是为了更好地利用CPU,提高程序执行速率的。

  • 相关阅读:
    Path Sum
    Binary Tree Level Order Traversal II
    Jump Game
    leedcode 刷题-V2
    (2016 年) githup 博客地址 : https://github.com/JMWY/MyBlog
    算法分类总结
    剑指 Offer 题目汇总索引
    LeedCde 题解目录
    趣味算法总目录
    常用
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7213807.html
Copyright © 2011-2022 走看看