Android Studio学习随笔-UI线程阻塞以及优化

咱们在使用手机的时候,常常会遇到一个问题:先是卡死,而后跳出该程序无响应,是否关闭的提示(固然有多是咱们手机性能太差=。=)这是由于线程的阻塞引发的,在这里我讲述一下UI线程,通常处理程序会在UI线程中执行耗时操做,这回致使UI线程阻塞,当UI线程阻塞,屏幕会出现卡死,用户体验会变得很是差,当线程阻塞超过5s,android系统可能进行干预,弹出对话框询问是否关闭。那如何解决呢?android

解决方案一:建立一个新线程app

我在UI视图中建立了一个button和一个textViewide

 
    Button button=(Button)findViewById (R.id.button);
       TextView textView=(TextView)findViewById(R.id.textView); TranslateAnimation animation=new TranslateAnimation(0,200,0,0); animation.setRepeatCount(3); animation.setDuration(2000); textView.setAnimation(animation);       //这里我让textView在进入app时进行移动动画 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) {//监听button的点击 new Thread(new Runnable() {//建立一个新线程 @Override public void run() { try { Thread.sleep(5000);//在这里我让线程进行耗时操做 } catch (InterruptedException e){
                e.printStackTrace();
              } } }).start(); }
   });

上面的代码我建立一个新的线程来实现耗时,可是实际过程当中进行的不可能只是一个耗时操做,让咱们在新线程中加两句话,TextView view=(TextView)v;view.setText(""+100);(获取到当前控件,并将其文字设置成100)如今让咱们再来试试这个程序,这个时候程序又报错了post

Only the original thread that created a view hierarchy can touch its views.

 

翻译成中文就是:只有建立view的那个线程才能对其进行修改。性能

其实谷歌有两条建议,也能够说是规矩动画

there are simply two rules to Android's single thread model:
    Do not block the Ui thread//不要阻塞UI线程
    Do not access the Android UI toolkit from outside the UI thread//不要在UI线程外的其余线程对视图中的组件进行设置

那么不少人就有疑问了,这不是矛盾了吗?谷歌也为咱们提供了解决方案url

解决方案一:view.postspa

上面代码出错是由于咱们在UI以外的线程调用了UI控件;那么如今,咱们在try{}catch(){}语句后增长一下代码线程

1      v.post(new Runnable() {
2                            @Override
3                            public void run() {
4                                TextView view=(TextView)v;
5                                view.setText(""+sun);
6                            }
7                        });

 

这段代码将个人语句提交到了UI线程中;可是view.post也有一些缺点翻译

冗余,可读性差,维护性差

 为此官方也提供了另一种解决方法

解决方法二:AsyncTask

AsyncTask和post方法大同小异

  private class DownloadImageTask extends  AsyncTask<String ,Void,Integer>{
        protected Integer   doInBackground(String...urls){
            try{
                Thread.sleep(5000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            int sun=100;
            return  sun;
        }
        protected void onPostExecute(Integer sum){
            button2.setText(""+sum);
        }
    }

 

button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadImageTask().execute();
                }
           });

 

咱们如今外部建立一个方法,而后在button的onClick事件中引用。

相关文章
相关标签/搜索