在java中,多线程是用于提高效率性能的。而在android中,多线程是必须的!为什么?

首先,我们得先知道android的ANR机制。在android系统中,当系统出现死机状态,系统就会跳出一个ANR对话框,来告知用户,该情况是由应用程序造成的,而非系统本身。

在两种情况下会出现ANR问题:

1)在主线程(即UI线程)执行耗时操作,5秒之内,未响应,且期间用户又触发了下一事件。

2)在广播接收者的onReceiver()方法执行超过10秒中。

下图为ANR对话框:

在android中,主线程执行布局,事件监听等操作,不允许有耗时操作,而耗时操作又是程序中不可避免的,所以,多线程是必须的。当我们要执行耗时操作时,我们就应该起一个子线程来进行耗时操作。下面代码模拟子线程耗时操作:

@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView1 = (TextView) findViewById(R.id.textView1);mTextView2 = (TextView) findViewById(R.id.textView2);Button button1 = (Button) findViewById(R.id.button1);OnClickListener listener = new OnClickListener(){@Overridepublic void onClick(View v){switch (v.getId()){case R.id.button1:new Thread(){public void run(){// 模拟耗时操作try{Thread.sleep(6000);mTextView1.setText("linli");}catch (InterruptedException e){e.printStackTrace();}}}.start();Log.e("MainActivity", "button1");break;case R.id.button2:break;default:break;}}};button1.setOnClickListener(listener);}

执行以上代码会出现FC错误,如下图所示对话框:

查看日志,出现下列信息:

出现该错误是因为,只有在UI线程中,才可以更新UI控件的属性。

想解决这类的FC错误,就得引用android的新技术――线程间通讯。

android中,为线程间通讯提供了两种方法:

1)Handler;

2)AsyncTask;

1.首先是Handler的用法:

1)创建一个继承Handler类的类,重写handleMessage()方法,如MyHandler类;

2)在子线程中,将更新UI控件的语句信息用所创建的类(MyHandler)的类型变量(myHandler)推送至所创建的类(myHandler.sendMessage(msg));

3)在handleMessage()方法中执行UI控件的更新操作;

代码如下:

private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg){String result = (String) msg.obj;switch (msg.what){case 1:mTextView1.setText(result);break;case 2:mTextView2.setText(result);break;default:break;}}};private TextView mTextView1;private TextView mTextView2;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView1 = (TextView) findViewById(R.id.textView1);mTextView2 = (TextView) findViewById(R.id.textView2);Button button1 = (Button) findViewById(R.id.button1);OnClickListener listener = new OnClickListener(){@Overridepublic void onClick(View v){switch (v.getId()){case R.id.button1:new Thread(){public void run(){// 模拟耗时操作try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}String result = "从网络获取的结果";Message msg = new Message();msg.what = 1;msg.obj = result;// 发送到main线程mHandler.sendMessage(msg);// textView.setText(result);}}.start();Log.e("MainActivity", "button1");break;case R.id.button2:Log.e("MainActivity", "button2");break;}}};button1.setOnClickListener(listener);Button button2 = (Button) findViewById(R.id.button2);button2.setOnClickListener(listener);}

未完待续~~~

更多相关文章

  1. Android对话框的高级设置《一》设置对话框按钮的图像和在内容文
  2. 从源码分析RxJava在Android里线程切换的实现
  3. Android UI 的更新及其线程模型
  4. Android——Android实现多级菜单联动操作
  5. Android多线程编程和线程池
  6. Android中的线程状态之AsyncTask详解
  7. Android任务、进程、线程的关系
  8. Android 主线程到底是什么、如何抛出ANR

随机推荐

  1. 彻底解决Android 拍照 内存溢出 Out of M
  2. 【Android 工具】Android 点9图片制作及
  3. android webview处理h5打开本地文件浏览
  4. Android(安卓)快速开发框架 最新总结
  5. VisualGDB 调试NDK程序
  6. ConnectivityService分析
  7. [android窗体泄露]android.view.WindowLe
  8. Android 关于移动互联网寒冬和个人核心竞
  9. Android获取系统储存以及内存信息(二)
  10. Android利用ksoap2写天气预报应用