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);
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。