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();
}
}
}
}
}