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; //創(chuàng)建 UI線程更新數(shù)據(jù),主要是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 對(duì)象必須是新new的。如果重復(fù)發(fā)送同一個(gè),就會(huì)卡住報(bào)錯(cuò)。 msg= new Message(); msg.what=R.id.tv1; msg.arg1=i; myHandler.sendMessage(msg); } } } class ATask extends AsyncTask{ @Override protected String doInBackground(Bundle... params) { //Bundle 可以進(jìn)行對(duì)象間的傳遞,此為后臺(tái)線程不是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 "執(zhí)行成功!!"; } @Override protected void onPreExecute() { //doInBackground執(zhí)行的準(zhǔn)備操作,執(zhí)行在UI線程的準(zhǔn)備操作 System.out.println("doInBackgroup執(zhí)行前操作.."); tv2.setText("開(kāi)始執(zhí)行更新.."); } @Override protected void onPostExecute(String s) { // doInBackground后臺(tái)執(zhí)行完畢后執(zhí)行,運(yùn)行該方法 System.out.println("doInBackgroup執(zhí)行后操作.."); tv2.setText(s+""); } @Override protected void onProgressUpdate(String... values) { // doInBackground后臺(tái)線程 運(yùn)行 publishProgress()向UI線程推送數(shù)據(jù) onProgressUpdate接收數(shù)據(jù) 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..開(kāi)始."); new TheadTest(myHandler).start(); } //UI線程內(nèi)部進(jìn)行UI數(shù)據(jù)量更新測(cè)試 按鈕2進(jìn)行測(cè)試 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); } } }
建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站、電商門(mén)戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!
tv1 在主線程 1-99顯示
tv1 異步更新值,通過(guò)handler顯示值
AsyncTask測(cè)試 ,遇到幾個(gè)問(wèn)題,并不很好用,1.當(dāng)前activity推出后,后臺(tái)執(zhí)行的線程仍然在執(zhí)行。
再次打開(kāi)程序仍然要等待上一次的任務(wù)執(zhí)行完畢后在執(zhí)行。
2.AsyncTask是串行執(zhí)行的,就是創(chuàng)建多個(gè) 任務(wù) 會(huì)在任務(wù)池里 按照 先進(jìn)先出的順序進(jìn)行執(zhí)行任務(wù)。當(dāng)前任務(wù)執(zhí)行完畢后 才能執(zhí)行下一個(gè)任務(wù)。再就是取消操作,如果后臺(tái)有線程在進(jìn)行循環(huán)操作,任務(wù)取消后,后臺(tái)程序仍然會(huì)在執(zhí)行。只是不會(huì)向UI線程 更新數(shù)據(jù),執(zhí)行并行需要
atask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,bundle);
API 至少11的版本才能運(yùn)行這個(gè)方法。