-
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。查看全部
-
在非ui线程中如果让线程休眠,那么就不能更新ui,如果不让线程休眠,又可以更新ui,原因我们可以从源码的角度去观察,但是不建议使用,最好还是通过使用handler的机制来实现对ui的更新查看全部
-
更新ui的四种方法: 第一种: private void handle1(){ handler.post(new Runnbale(){ public void run(){ textView.setText("ok"); } }); } 第二种:直接在子线程中使用sendMessage,在创建handler对象的时候,在其中的handleMessage方法中去更新ui private void handler2(){ handler.sendEmptyMessage(1); } 第三种: private void handler3(){ runOnUiThread(new Runnable(){ public void run(){ textView.setText("ok"); } }) } 第四种: private void viewUi(){ textView.post(new Runnable(){ public void run(){ textView.setText("ok"); } }) }查看全部
-
重点: handler负责发送消息,Looper负责接收handler发送的消息,并直接把消息回传给handler自己,MessageQueue就是一个存储消息的容器查看全部
-
google为什么只设计了handler来解决更新ui的问题? 最根本的目的就是解决多线程并发问题,假设如果在一个Activity当中,有多个线程去更新ui,并且都没有加锁机制,那么就会出现更新界面错乱,但是如果都进行加锁处理的话,又会导致性能下降 因此,产生了这种handler的更新机制,根本不用去关心多线程的问题,所有的更新ui的操作,都是在主线程的消息队列当中去轮询处理的查看全部
-
通过 handler来实现sendMessage的方法的步骤: 1.创建一个handler的对象,并在其中重写handlerMessage的方法,并在其中更新ui private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { extView.setText("" + msg.arg1);};}; 2.创建一个Thread类,在其中的run()方法中初始化一个message,并为message来赋值,并调用handler的sendMessage的方法 new Thread() { public void run() { try { Thread.sleep(2000); Message message = new Message(); message.arg1 = 88; handler.sendMessage(message); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; 这样,执行这个线程的时候就会通过sendMessage的方法将message参数传递过去,并在上面的初始化handler的时候接受到参数,并实现更新ui查看全部
-
通过handler来实现图片定时轮播的代码: public class MainActivity extends Activity { private Handler handler = new Handler(); private ImageView imageView; // 将我们保存在文件夹中的三张图片进行了实例化 private int[] images = { R.drawable.image1, R.drawable.image2, R.drawable.image3 }; // 创建的下标,用来实现当前是哪张图片显示 private int index; // 创建了一个我们自己写的Runnable的对象 private MyRunnable myRunnbale = new MyRunnable(); class MyRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub index++; index = index % 3; imageView.setImageResource(images[index]); // 通过handler的postDelayed的方法,进行定时的执行run方法中的代码 handler.postDelayed(myRunnbale, 1000); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView1); imageView = (ImageView) findViewById(R.id.imageView1); // 在主线程中执行上面的操作 handler.postDelayed(myRunnbale, 1000); } }查看全部
-
handler的四种使用的方法: sendMessage sendMessageDelayed post(Runnable) postDelayed(Runnable,long)查看全部
-
new Thread() { public void run() { try { Thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // 更新文本信息 // 此时直接在这里更新ui的时候,程序将会直接崩溃掉 textView.setText("更新了"); } }); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); 从上面的方法中我们可以知道,如果想直接更新ui,我们需要在Thread的run方法中通过 handler.post()的方法来实现,而post方法中的参数是一个new Runnable(){public void run(){} ,然后我们在这个run方法中去更新ui,这才是正确的方法查看全部
-
说明:如果我们直接在一个Activity中new一个Thread,并在其中的run方法中去更新ui,那么此时这个程序是会直接崩溃掉的,也就是说,我们不能直接在非ui线程中去更新ui,需要使用到Handler的机制才能实现我们的效果:查看全部
-
为什么需要使用handler: Android在设计的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制的话,就没有办法更新ui信息,也就是不使用handler会抛出异常消息查看全部
-
什么是handler: handler是android给我们提供用来更新UI的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通过它来处理消息查看全部
-
handler 负责发送消息, looper负责接收handler发送的消息,并直接把消息回传给handler自己。MessageQueue就是一个存储消息的容器查看全部
-
handler是android给我们提供用来更新UI的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通过它处理消息查看全部
-
为什么要用handler?查看全部
举报
0/150
提交
取消