Androidサブスレッドテスト

4414 ワード

    private volatile boolean mStopped = false;
    private int i;
    TextView tv1;
    TextView tv2;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        tv1 = (TextView) findViewById(R.id.tv1);
        tv2 = (TextView) findViewById(R.id.tv2);

        Button button4 = (Button) findViewById(R.id.button4);    //  “  ”  
        Button button5 = (Button) findViewById(R.id.button5);    //  “  ”  

        //    
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if( mStopped = true) {
                    mStopped = false;
                    Log.i("   ID", String.valueOf(Thread.currentThread().getId()));
                    Log.i("   var", String.valueOf(Thread.currentThread().getName()));

                    fgetsum(String.valueOf("mytv1"), 1);
                    fgetsum(String.valueOf("mytv2"), 2);
                }
            }
        });


        //      
        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mStopped = true;
            }
        });




    }






    //  Handler      ,Handler         Message   Rannable           MessageQueue 
    //Handler  Message  ,   tv1
    //       UI
    final Handler handler2 = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 0x101:
                    tv1.setText(String.valueOf(msg.obj.toString()));
                    break;
                case 0x102:
                    tv2.setText(String.valueOf(msg.obj.toString()));
                    break;
                default:
                    tv1.setText(String.valueOf("  msg.what"));
                    break;
            }

        }
    };



    //  Runnable  
    //       Message Handler
    //Runnable   UI  ,           UI    
    private void fgetsum(final String strname, final int tvid) {
        Thread thread = new Thread() {
            @Override
            public void run() {


                while (mStopped == false) {
                    i++;
                    try {
                        Thread.sleep(1000);
                        Log.i("   ID" + strname, String.valueOf(Thread.currentThread().getId()));
                        Log.i("    " + strname, String.valueOf(Thread.currentThread().getName()));

                        Message message = handler2.obtainMessage();
                        message.arg1 = tvid;
                       //  tvid=1    ,    i
                        if(tvid==1){
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.getDefault());
                            message.what=0x101;
                            message.obj = String.valueOf(sdf.format(new Date()));
                        }else{
                            message.what=0x102;
                            message.obj =i;
                        }


                        handler2.sendMessage(message);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

        }
        };
        thread.start();
        thread = null;
    }

 
Androidはwinformと同様に、メインスレッドでUIのコントロールを直接更新することはできません.そうしないと、インタフェースが偽死します(進捗バー、ダウンロードなどのタスクなど)
ASP.NETの下にはBackgroundWorkerがありますが、Androidは一般的にHandler+Thread+Messageで実現され、使い慣れています.ネットの人は、JAVAプログラムを見るのは慣れないと言って、多くの機能が実現します.NET面倒くさい....
 
またJAVAの資料を調べてみると、N個のスレッドを作成するには、ラインプログラムプール(ExecutorService)を使用することをお勧めします.