Anndroid学习---使用线程Handler

来源:互联网 发布:sql复制表结构 编辑:程序博客网 时间:2024/05/23 21:49

Anndroid学习—使用线程 Handler

使用Java里面常用的线程调用方式,发现不可以

1 .

package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;public class MainActivity extends AppCompatActivity { EditText editText;    Button button;    Handler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText2);        button = (Button) findViewById(R.id.button);       /* handler = new Handler(){            @Override            public void handleMessage(Message msg) {//                super.handleMessage(msg);                editText.setText("star Thread");            }        };*/        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {//                editText.setText("sss");                MyThread myThread = new MyThread();                myThread.start();            }        });    }    class  MyThread extends  Thread{        @Override        public void run() {//         super.run();      editText.setText("star Thread");           /* try {            Thread.sleep(6000);            } catch (InterruptedException e) {                e.printStackTrace();            }*///            handler.sendEmptyMessage(0);        }    }}

2 . 分析错误

E/AndroidRuntime: FATAL EXCEPTION: Thread-192                  Process: com.example.administrator.myapplication, PID: 3528                  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.                      at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)                      at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)                      at android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,如果在非UI线程中直接操作UI线程,
会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that
created a view hierarchy can touch its views,这与普通的java程序不同。

由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,
UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,
否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序(ANP)。
如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,
因此android采用一种的Message Queue机制保证线程间通信。
可以在自己的子线程中创建Handler与UI thread通讯

线程的简单使用-点击按钮文本框显示指定内容

package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { EditText editText;    Button button;    Handler handler;    MyThread myThread;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText2);        button = (Button) findViewById(R.id.button);       handler = new Handler(){            @Override            public void handleMessage(Message msg) {//                super.handleMessage(msg);               editText.setText("star Thread");            }        };        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {//                editText.setText("sss");                 myThread = new MyThread();                myThread.start();            }        });    }    class  MyThread extends  Thread{        @Override        public void run() {                while(true){                try {                    Thread.sleep(1000);                    handler.sendEmptyMessage(0);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

这里写图片描述

用thread handler 实现图片变换

package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { EditText editText;    Button button;    Button button2;    Handler handler;    ImageView imageView;    MyThread myThread;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText2);        button = (Button) findViewById(R.id.button);        imageView = (ImageView) findViewById(R.id.imageView);        button2= (Button) findViewById(R.id.button2);       handler = new Handler(){            @Override            public void handleMessage(Message msg) {//                super.handleMessage(msg);                switch (msg.what){                    case 1 :                        imageView.setImageResource(R.mipmap.ic_launcher);                        break;                    case  2 :                        imageView.setImageResource(R.mipmap.abc_ic_star_black_16dp);                        break;                }               // editText.setText("star Thread");            }        };        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {//                editText.setText("sss");                 myThread = new MyThread();                myThread.is= true;                myThread.start();            }        });        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                myThread.is= false;            }        });    }    class  MyThread extends  Thread{        boolean is=true;        @Override        public void run() {            int what = 1;            while(is){                try {                    Thread.sleep(1000);                    handler.sendEmptyMessage((what++)%2+1);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}
0 0
原创粉丝点击