扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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{ @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的版本才能运行这个方法。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流