Androidラーニングシリーズ-スレッドモデル

5356 ワード

スレッドモデル
  • android UIスレッド
  • child-process
  • の使用方法
    ANRエラー
    単一スレッドによるANRエラー:ANRエラー(Application Not Responding)は、メインUIプロセスが5秒以上ブロックされて発生したエラーを指し、プログラムの正常な動作を終了します.ANRエラーの原因は、単一スレッドです.
        public class MainActivity extends Activity {
            private Button btn;
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                btn=(Button) findViewById(R.id.btn);
                btn.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int count=0;
                        while(count<1000){
                            count++;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }); 
            }
        }

    に改心
        private Thread thread;
        thread=new Thread(new Runnable() {
            @Override
            public void run() {
                int count=0;
                while(count<1000){
                    count++;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(count);
                }
            }
        });
        thread.start();//    
        thread.stop();//    

    このスレッドでUIを更新するとエラーも発生します
    Androidスレッド間の通信——Handler
    実は、Androidスレッド間の通信はHandlerだけでなく、Message,MessageQueue,Looperの相互使用も必要であり、Androidスレッド通信モデルは以下の通りである.
    Thread ->[handler] -> Loop(message|> messageQueue)
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    public class MainActivity extends Activity {
        private Button btn_start,btn_stop;
        private TextView tv;
        private int i=0;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_start=(Button) findViewById(R.id.button1);
            btn_stop=(Button) findViewById(R.id.button2);
            tv=(TextView) findViewById(R.id.textView1);
            btn_start.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //      
                    handler.post(runnable);
                }
            });
            btn_stop.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //      
                    handler.removeCallbacks(runnabl);
                }
            });
        }
        //      
        private Runnable runnable=new Runnable() {
            @Override
            public void run() {
                i++;
                //  Message   UI     
                Message m=new Message();
                //  Message arg1    arg2    int        
                m.arg1=i;
                //  Handler    
                handler.sendMessage(m);
            }
        };
        @SuppressLint("HandlerLeak")
        private Handler handler=new Handler(){
            public void handleMessage(Message m){
                System.out.println(m.arg1);
                String str=m.arg1+"";
                tv.setText(str);
                handler.post(runnable);
            }
        };
    }
  • Message:伝達するメッセージ;
  • MessageQueue:メッセージを格納するキュー;
  • Looper:MessageQueueを作成し、その中のMessageを繰り返し使用します.
  • Handler:メッセージの伝達に使用されます.

  • 1、handler2、Activity.runOnUIThread(Runnable)3、View.Post(Runnable)4、View.PostDelayed(Runnabe,long)5、AsyncTask
  • Thread , Runnable

  • AsyncTask
    // 
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    public class MainActivity extends Activity {
        private Button btn1,btn2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn1=(Button) findViewById(R.id.button1);
            btn2=(Button) findViewById(R.id.button2);
            btn1.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //  AsyncTask   
                    new MyAsyncTask().execute();
                }
            });
            btn2.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("Hello To EveryOne");
                }
            });
        }
    }
    
    // 
    import android.os.AsyncTask;
    /**
     *        ,        
     * @author asus
     */
    public class MyAsyncTask extends AsyncTask{
        //    ,         
        @Override
        protected String doInVoid(params) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }
    }