listview 可以暂时告一段落了。。。

   下面说说android的多线程机制,讲到多线程,就可以说道android有名的ANR(Application Not Responding)既应用程序未响应,触发ANR的条件大致有两个:1、在activity中超过5秒的时间未能响应下一个事件。2、BroadcastReceive超过10秒,这两个条件都会触发ANR。

   下面模拟一个activity的ANR

protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViewById(R.id.button1).setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View v)            {                try                {                    Thread.sleep(10000);                }                catch (InterruptedException e)                {                    e.printStackTrace();                }            }        });    }

   运行效果:

               未触发:

                         触发后:


当用户使用时 出现这样的体验,可想而知会很蛋疼的。。。

有人就会问 为什么会有ANR这样的机制。

其实android系统中所有的UI显示都是在main线程中执行的,如果线程中有耗时操作时,线程中的其他UI组件就会等耗时结束时才能开始响应,所以为了避免这样的情况,android用handler将耗时操作放到子线程中执行,当结束时,将耗时操作的结果发回给主线程,所以这里又要引入线程间通信的概念


额(⊙o⊙)… 到这里感觉 新概念越写越多了。。。。  没事 慢慢解决么。。。

这么说感觉线程间通讯 很蛋疼 其实 也就调用一个方法而已。。。。

嘿嘿


不多说了 看代码先

private Handler mHandler = new Handler(){    //参数:Message相当于一种信息的载体,可以将子线程的数据传到主线程中,也就是所谓的线程间通信了。。。    public void handleMessage(android.os.Message msg)    {//该方法在主线程中执行,不信的话可以log的。。。        String result = (String) msg.obj;//从主线程传来的数据            switch (msg.what)//what用于标记谁传来的信息        {        case 1:            mTextView1.setText(result);//做UI组件的设置必须在主线程否则会报错的。。。            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);    button1.setOnClickListener(listener);    Button button2 = (Button) findViewById(R.id.button2);    button2.setOnClickListener(listener);                }private OnClickListener listener = new OnClickListener()    {        @Override        public 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:                new Thread()                {                    public void run() {                        // 模拟耗时操作                        try                        {                            Thread.sleep(1000);                        }                        catch (InterruptedException e)                        {                            e.printStackTrace();                        }                        String result = "从数据库获取的结果";                        Message msg = new Message();                        msg.what = 2;                        msg.obj = result;                        // 发送到main线程                        mHandler.sendMessage(msg);                    }                }.start();                Log.e("MainActivity", "button2");                break;            default:                break;            }        }    };

我会把源代码 附加到文章的 布局文件 就不写了,占地方。。。

运行结果:


handler 差不多就这些了。。。代码的项目超过2mb 了 我放到51cto的网盘里了

链接:handler



下面讲讲 post,其实view.post和handle.post这两个方法差不多,都是在post方法中传入一个实现了Runnable接口的对象,在这个对象的run方法中实现


private TextView mTextView;    private Button mButton;    class Listener implements OnClickListener    {        @Override        public void onClick(View v)        {            switch (v.getId())            {            case R.id.button1:                download();                break;            default:                break;            }        }    }    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mButton = (Button) findViewById(R.id.button1);        mButton.setOnClickListener(new Listener());    }    public void download()    {        new PlayThread().start();//开启子线程    }    class PlayThread extends Thread    {        @Override        public void run()        {// 这是子线程            try            {                Thread.sleep(2000);//模拟从网络下载数据的耗时操作            }            catch (InterruptedException e)            {                e.printStackTrace();            }                                                                                                                                                                                                    mButton.post(new Runnable()//这里用的是view的post方法            {//这里的内容将在主线程中显示                @Override                public void run()                {                    mTextView.setText("yes 获取到数据了~~~");                }            });        }    }


runOnUiThread(Runnable action)方法和handler.post(Runnable action)方法,这两个方法的用法跟view.post(Runnable action)方法的用法一样

runOnUiThread(Runnable action)是activity的方法,这里的Runnable同样是运行在主线程中的

handler.post(Runnable action)是handler中的方法,大同小异,当然如果大家能告诉我这之间的区别我也会洗耳恭听的,相互学习么,谢谢啦。。。






更多相关文章

  1. android 笔记 --- 相机应用
  2. Android开发网上的一些重要知识点_2
  3. Android的应用组件
  4. android开发技巧精髓十
  5. Android统一处理断网
  6. Android应用程序的默认最大内存值以及修改
  7. android: 使用 AsyncTask
  8. Android(安卓)面试(四):Android(安卓)Service 你真的能应答自如了吗
  9. JAVA与Android(安卓)世界级序列化危机与应对方案

随机推荐

  1. Android用户界面 UI组件--自动提示输入框
  2. OpenCV4Android开发之旅(一)----OpenCV2.
  3. android设定手机的显示模式,横竖屏,是否全
  4. [转载]系统内置的一些工具类
  5. 自定义RadioButton 文字在下,图片在上
  6. android中shape的使用(android:angle小解)
  7. [置顶] Android:图解Activity启动流程源码
  8. 使用Android(安卓)Studio在64位Ubuntu环
  9. Android系统信息和安全机制(学习笔记)
  10. Android 第七天(下午)