Android Studio学習エッセイ-UIスレッドのブロックと最適化

3288 ワード

私たちが携帯電話を使用しているとき、よく問題に遭遇します.まずカードが死んでから、このプログラムから飛び出して応答しないかどうか、閉じるかどうかのヒント(もちろん私たちの携帯電話の性能が悪いかもしれません=.=)これはスレッドのブロックによるものです.ここでUIスレッドについて説明します.一般的なプロセッサはUIスレッドの中で時間のかかる操作を実行し、今回UIスレッドがブロックされ、UIスレッドがブロックされると、画面がカードが死んでしまいます.ユーザー体験が非常に悪くなり、スレッドのブロックが5 sを超えるとandroidシステムが介入する可能性があり、ポップアップダイアログボックスが閉じているかどうかを尋ねます.どうやって解決しますか?
ソリューション1:新しいスレッドを作成する
UIビューでbuttonとtextViewを作成しました

    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();
        }
   });
 
上のコードは私が新しいスレッドを作成して時間がかかりますが、実際の過程で行うことはできません.新しいスレッドに2つの言葉を追加しましょう.TextView=(TextView)v;view.setText(""+100);(現在のコントロールを取得し、文字を100に設定)このプログラムを試してみましょう.このとき、プログラムが間違っています.
Only the original thread that created a view hierarchy can touch its views.
viewを作成したスレッドだけが修正できます.
実はグーグルには2つのアドバイスがありますが、ルールとも言えます
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                   
では多くの人が疑問を持っていますが、これは矛盾ではありませんか?Googleもソリューションを提供してくれました
解決策1:view.post
上のコードが間違っているのは、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スレッドに提出しました.でもねpostにもいくつかの欠点があります
  ,    ,    
このため公式にも別の解決策が提供されています
解決方法2:AsyncTask
AsyncTaskとpostの方法は大同小異である
 
 private class DownloadImageTask extends  AsyncTask{
        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イベントで参照します.