//定义一个Handler      private Handler mHandler = new Handler(){          public void handleMessage(Message msg){              switch (msg.what) {                           case SHOW:  //将单词显示出来,这个是单词和选项            ll_wordtest_progress.setVisibility(View.GONE) ;             ll_wordtest_wordimformation.setVisibility(View.VISIBLE) ;             ans_a =  lWord.getAnsChoiseA() ;            ans_b = lWord.getAnsChoiseB() ;            ans_c = lWord.getAnsChoiseC() ;            ans_d = lWord.getAnsChoiseD() ;            word  = lWord.getAnswerName() ;            dirctWordID = lWord.getId() ; //中的数据库的id,用于用户标记掌握单词还是重点单词            ansIndex = lWord.getAnsIndex() ; //答案的顺序好            tv_wordtest_ans_word.setText(word) ;            tv_wordtest_ans_a.setText(ans_a) ;            tv_wordtest_ans_b.setText(ans_b) ;            tv_wordtest_ans_c.setText(ans_c) ;            tv_wordtest_ans_d.setText(ans_d) ;            ll_wordtest_progress.setVisibility(View.GONE) ;            ll_wordtest_wordimformation.setVisibility(View.VISIBLE) ;                Thread.currentThread().interrupt();                  break;            case STOP:                              Thread.currentThread().interrupt();                  break;            case NEXT:                                          break;            case BACK:            Intent intent = new Intent() ;            intent.putExtra("message", "nodata") ;intent.setClass(mContext, WordTestSetActivity.class) ;setResult(RESULT_OK,intent);  /*结束本Activity*/  finish();  startActivity(intent) ;   overridePendingTransition(R.anim.slide_left,R.anim.slide_right);               break ;                         }          }      };  

一般我们用

mHandler.handleMessage(msg) ;

这个方法来通知handler去更新或者操作一些事情吧,但是当遇到更新UI的时候,不能用这个方法的。

Message msg = new Message() ;msg.what = SHOW ;mHandler.handleMessage(msg) ;//mHandler.sendEmptyMessageDelayed(SHOW, 0);msg = null ;

这个方法用不来的,要用


Message msg = new Message() ;msg.what = SHOW ;//mHandler.handleMessage(msg) ;mHandler.sendEmptyMessageDelayed(SHOW, 0);msg = null ;

mHandler.sendEmptyMessageDelayed(SHOW, 0);

要用这个方法的。

下面的是转来的说明,写的超级好,虽然我还是没有区分上面两个方法不同。等有时候再好好学下吧。


Android,UI主线程与子线程

    博客分类:
  • Android
UI 多线程 Android thread 工作

在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。

一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。

在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一 个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行, 以免阻塞主线程。


那么,UI Thread如何和其他Thread一起工作呢?常用方法是:

诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。


例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:

11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.

意思是,无法在子线程中更新UI。为此,我们需要通过Handler物件,通知主线程Ui Thread来更新界面。

如下,首先创建一个Handler,来监听Message的事件:

private final int UPDATE_UI = 1;
private Handler mHandler = new MainHandler();

private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}

或者

private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}


当子线程的状态发生变化,则在子线程中发出Message,通知更新UI。

mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);


在我们的程序中,很多Callback方法有时候并不是运行在主线程当中的,所以如果在Callback方法中更新UI失败,也可以采用上面的方法。

更多相关文章

  1. Android应用开发中如何进行单元测试
  2. rk3288 android 7.1 串口使用
  3. Android(安卓)Hugo
  4. Android(安卓)RecyclerView:设置指定位置的两种方法
  5. android中获取到当前线程
  6. android线程相关1
  7. android View的三个构造方法 简单总结
  8. Android(安卓)SurfaceView
  9. Android抓包方法

随机推荐

  1. 快速提高Android开发调试的使用技巧
  2. Android(安卓)adb opendir failed ,permi
  3. 编程回忆之Android回忆(AnimationDrawable
  4. Android(安卓)Widget事件
  5. 高通Android(安卓)display架构分析
  6. input subsystem
  7. RabbitMQ 入门之基础概念
  8. ERROR:Android(安卓)requires .class comp
  9. 居中显示并旋转 android Button 里的属性
  10. Android(安卓)adb 查看已经安装的应用、