package yjm.com.testcontrol;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.Serializable;

public class TestActivity extends Activity implements View.OnClickListener{
    TextView tv1;
    TextView tv2;
    Button btn1;
    Button btn2;
    Button btn3;
    Button btn4;
    ProgressBar pro1;
    ATask atask;

    //创建 UI线程更新数据,主要是UI 控件 不支持异步线程更新,必须所有的值都在UI线程值才能修改
     Handler myHandler = new Handler(){
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what){
                 case R.id.tv1:
                     tv1.setText(""+msg.arg1+"");
                     break;
                 case R.id.tv2:
                     tv2.setText(""+msg.arg2+"");
             }

             super.handleMessage(msg);
         }
     };

    class UiInfo implements Serializable{
        private String uiName;
        private String uiActivity;
        private String uiUrl;

        public void setUiName(String uiName) {
            this.uiName = uiName;
        }

        public void setUiActivity(String uiActivity) {
            this.uiActivity = uiActivity;
        }

        public void setUiUrl(String uiUrl) {
            this.uiUrl = uiUrl;
        }

        public String getUiName() {
            return uiName;
        }

        public String getUiActivity() {
            return uiActivity;
        }

        public String getUiUrl() {
            return uiUrl;
        }

    }


     class TheadTest extends Thread{
         Handler myHandler;
         Message msg;
         public TheadTest(Handler handler){
              this.myHandler=handler;
         }
        @Override
        public void run(){

            for (int i = 0; i <100 ; i++) {
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //此message 对象必须是新new的。如果重复发送同一个,就会卡住报错。
                msg= new Message();
                msg.what=R.id.tv1;
                msg.arg1=i;
                myHandler.sendMessage(msg);
            }
        }
    }


    class ATask extends AsyncTask<Bundle,String,String>{



        @Override
        protected String doInBackground(Bundle... params) {
            //Bundle 可以进行对象间的传递,此为后台线程不是UI线程
            Bundle bundle =params[0];
            UiInfo uiInfo= (UiInfo) bundle.getSerializable("uiinfo");
            for (int i = 0; i <100 ; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
                publishProgress(i+"");
        }

            return "执行成功!!";
        }

        @Override
        protected void onPreExecute() {
            //doInBackground执行的准备操作,执行在UI线程的准备操作
            System.out.println("doInBackgroup执行前操作..");
            tv2.setText("开始执行更新..");

        }

        @Override
        protected void onPostExecute(String s) {
//            doInBackground后台执行完毕后执行,运行该方法
            System.out.println("doInBackgroup执行后操作..");
            tv2.setText(s+"");

        }

        @Override
        protected void onProgressUpdate(String... values) {
//            doInBackground后台线程 运行 publishProgress()向UI线程推送数据 onProgressUpdate接收数据
            tv2.setText(values[0]+"%");
            pro1.setProgress(Integer.parseInt(values[0]));
        }


    }

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

        tv1=(TextView)findViewById(R.id.tv1);
        tv2=(TextView)findViewById(R.id.tv2);
        pro1=(ProgressBar)findViewById(R.id.pro1);
        btn1=(Button)findViewById(R.id.btn1);
        btn2=(Button)findViewById(R.id.btn2);
        btn3=(Button)findViewById(R.id.btn3);
        btn4=(Button)findViewById(R.id.btn4);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.btn1){
            tv1.setText("btn1_test..开始.");
            new TheadTest(myHandler).start();
        }
        //UI线程内部进行UI数据量更新测试 按钮2进行测试
        if(view.getId()==R.id.btn2){
            for (int i = 0; i <10000 ; i++) {
                tv2.setText("btn2_test...:"+i);
            }
        }

        if(view.getId()==R.id.btn3){
            atask= new ATask();

                Bundle bundle = new Bundle();
                UiInfo uiInfo = new UiInfo();
                uiInfo.setUiName("processBar");
                bundle.putString("hello","hello");
                bundle.putSerializable("uiinfo", uiInfo);
                atask.execute(bundle);


        }

        if(view.getId()==R.id.btn4){
            atask.cancel(true);

        }


    }
}


tv1 在主线程 1-99显示

tv1 异步更新值,通过handler显示值

AsyncTask测试 ,遇到几个问题,并不很好用,1.当前activity推出后,后台执行的线程仍然在执行。

再次打开程序仍然要等待上一次的任务执行完毕后在执行。

2.AsyncTask是串行执行的,就是创建多个 任务 会在任务池里 按照 先进先出的顺序进行执行任务。当前任务执行完毕后 才能执行下一个任务。再就是取消操作,如果后台有线程在进行循环操作,任务取消后,后台程序仍然会在执行。只是不会向UI线程 更新数据,执行并行需要 

 

atask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,bundle);

API 至少11的版本才能运行这个方法。