Android当中的线程
Android铁律。在UI线程之外不能修改UI、
在Android中线程可以分为两大块,一个是Main Thread(UI线程、主线程)一个是Worder Thread(其他线程(原则上来说是不能操作UI的))。
class mythread extends Thread{
public void run(){
try {
Thread.sleep(1*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
textview.setText("来自线程的修改");
}
}//线程的定义和JAVA一样,这个线程先休息一秒钟。然后去修改textview的内容。
但是这样运行会出错,因为这个是一个Worker Thread
我们需要在主线程里面才能修改UI.
但是有一些控件是允许的 例如progress Bar.
如果所有事情都放在主线程里面来做的话,就会堵塞。会出现程序没有响应。
在一个应用程序当中,主线程通常用于接受用户的输入,以及将运算的结果反馈给用户。
所以说对于一些可能会产生阻塞的操作必须放在 worker thread.
______________________________________________________
handler looper MessageQueue
handler负者把消息对象加入消息队列,之后looper不停的从消息队列中取出消息对象(如果没有对象looper就处于等待的状态),looper将会调用handler的message的方法。
public class MainActivity extends Activity {
private Button button;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.buttonid);
handler=new FirstHandler();
button.setOnClickListener(new ButtonListener());
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
//当用户点击一个按钮时,我们创建一个消息对象,并使用Handler发送该对象
Message msg =handler.obtainMessage();//获取一个消息对象
msg.what=2;//给这个对象的属性赋值
handler.sendMessage(msg);//然后把这个对象放到handler里面去
//上面一行代码将消息对象放置到消息队列当中
//1.Looper将会从消息队列当中将消息对象取出。
//2.Looper将会找到与消息对象对应的Handler对象
//3.Looper将会调用Handler对象的handleMessage(Message msg)方法,用于处理消息对象
}
}
class FirstHandler extends Handler{
@Override
public void handleMessage(Message msg) {
int what=msg.what;
System.out.println(what);
}
}