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的版本才能运行这个方法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。