Handler子线程向主线程发送消息

1.由于在UI活动中不能进行耗时操作,因此不能再UIActivity中创建线程要不然会报错
2.Handler就是在Thread和UI主线程之间进行通讯的桥梁,线程的信息必须通过Handler来传递到UI主线程上(在代码中被注释的部分)
3.也可以直接用Handler来直接对UI主线程进行操作
4.操作的具体方法是 handler.sendEmptyMessage(TIME_DESC);发送一个空消息,然后Handler对这个消息进行处理

Handler主线程向子线程发送消息

1.新建一个类继承与Thread复写里面的run方法
2.在子线程中必须有Looper.prepare();和Looper.loop();这两个方法,(这两个方法在UI主线程中默认存在)并且将Handler的创建的对象和复写的方法都必须放到这两个方法之间,
3.启动线程,然后延时一会再发送信息(因为在启动线程的时候,会new一个Handler对象,这个是需要耗时操作的,如果不进行延时很有可能报空指针错误)

public class MainActivity extends AppCompatActivity {
    private Button mBtnTime;
    private Button mBtnSend;
    private int count=60;
    public static final int TIME_DESC=0x00;
    private android.os.Handler handlerSend;
    private android.os.Handler handler=new android.os.Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case TIME_DESC:
//                    String time= (String) msg.obj;
                    count--;
                    mBtnTime.setText(count+"秒");
                    if (count>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(TIME_DESC);
                    }
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnTime= (Button) findViewById(R.id.button_time_edsc);
        mBtnTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //直接用Handler进行通讯
                count=60;
                handler.sendEmptyMessage(TIME_DESC);
                //子线程向主线程发送消息
//                    new Thread(new Runnable() {
//                        @Override
//                        public void run() {
//                            while (count>0){
//                            try {
//                                Thread.sleep(1000);
//                            } catch (InterruptedException e) {
//                                e.printStackTrace();
//                            }
//                            count--;
//                            Message message=new Message();
//                            message.obj=count+"秒";
//                            message.what=TIME_DESC;
//                            handler.sendMessage(message);
//                            }
//                        }
//                    }).start();
                }

        });
        mBtnSend= (Button) findViewById(R.id.button_send);
        mBtnSend.setOnClickListener(new View.OnClickListener() {
        //主线程向子线程发送消息
            @Override
            public void onClick(View v) {
                MyThread myThread=new MyThread();
                myThread.start();
                //这里加延时的作用是因为MyThread中Handler要新创建一个对象,这个过程需要时间
                //因此如果立刻发送消息就会报空指针的错误
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handlerSend.sendEmptyMessage(0);
            }
        });
    }
    class MyThread extends Thread{
    //接收主线程发送过来的消息
        @Override
        public void run() {
            Looper.prepare();
            handlerSend=new android.os.Handler(){
                @Override
                public void handleMessage(Message msg) {
                    Log.d("handler","接收到主线程发送过来的消息");
                }
            };
            Looper.loop();
        }
    }
}

AsyncTask

1.AsyncTask是封装了Handler了方法,主要的方法有
2.doInBackground()相当于创建一个新的线程
3.onPostExecute,返回结果的方法
4.onProgressUpdate 中间过程处理的方法

public class MainActivity extends AppCompatActivity {
    private Button mBtnStart;
    private ProgressBar mProgressBar;
    private int count=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnStart= (Button) findViewById(R.id.button_start);
        mProgressBar= (ProgressBar) findViewById(R.id.progressbar);
        mBtnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyAsyncTask task=new MyAsyncTask();//创建一个新的AsyncTask对象
                task.execute("执行");              //调用execut开始执行
            }
        });
    }
    class MyAsyncTask extends AsyncTask<String,Integer,String>{
        /***
         * 该方法是用于后台操作, 相当于新建一个线程进行操作
         * @param params 传入的是String类型的参数
         * @return      处理结束之后返回的一个String类型的结果,传入onPostExecute中
         */
        @Override
        protected String doInBackground(String... params) {
            while (count<101){
                count++;
                publishProgress(count);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "已完成";
        }

        /***
         * 接收doInBackground返回的结果
         * @param s oInBackground返回的结果
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mBtnStart.setText(s);   //在button上显示结果
        }

        /***
         * oInBackground中间产生的变量,通过publishProgress传到该方法内,对其进行处理
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            int count=values[0];
            mProgressBar.setProgress(count);//将count设置在progressbar上进行显示进度
        }
    }
}