咱们在使用手机的时候,常常会遇到一个问题:先是卡死,而后跳出该程序无响应,是否关闭的提示(固然有多是咱们手机性能太差=。=)这是由于线程的阻塞引发的,在这里我讲述一下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事件中引用。