既然Android的不同意使用子线程来进行数据设置,那么我们就耗时操作完成后再进行数据操作,查看官方API,官方说使用
1.View.post
2.AsyncTask
我们先用post测试使用一下
public class MainActivity extends Activity {
private Button yidongBtn=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
yidongBtn=(Button)findViewById(R.id.yidongBtn);
//给btn设置动画
TranslateAnimation animation=new TranslateAnimation(0,1500,0,0);
animation.setRepeatCount(20);
animation.setDuration(2000);
yidongBtn.setAnimation(animation);
final Button btn2=(Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
//1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程)
System.out.println("new子线程开始执行...");
new Thread(new Runnable() {
@Override
public void run() {
//设置其耗时操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Log.i("耗时操作",e.getMessage());
}
v.post(new Runnable() {
@Override
public void run() {
int sum=10;
btn2.setText("计数:"+sum);
System.out.println("View.post视图post被执行了....");
}
});
System.out.println("new子线程执行结束...");
}
}).start();
}
});
}
我们检测一下这个执行过程,发现打印的顺序是:
这个过程说明了我们的赋值操作是在线程执行完成后进行的,又根据Android官方的API提出的观点来讲,这说明一定有一个“第三者”充当传达命令角色:主线程分配任务给“第三者”,子线程从“第三者”中去取抓取任务。
(其实第三者就是Handler)
由于上面的代码可读性差,代码冗余,所以官方对这段代码进行封装
private Button yidongBtn=null;
private Button btn2=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
yidongBtn=(Button)findViewById(R.id.yidongBtn);
//给btn设置动画
TranslateAnimation animation=new TranslateAnimation(0,1500,0,0);
animation.setRepeatCount(20);
animation.setDuration(2000);
yidongBtn.setAnimation(animation);
btn2=(Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new ChangeAnsyncTask().execute();
}
});
/**
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
//1.不要阻塞UI线程(这里我不阻塞线程,我重新new线程)
System.out.println("UI线程Id:"+Thread.currentThread().getId());
System.out.println("new子线程开始执行...");
new Thread(new Runnable() {
@Override
public void run() {
//设置其耗时操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Log.i("耗时操作",e.getMessage());
}
v.post(new Runnable() {
@Override
public void run() {
int sum=10;
btn2.setText("计数:"+sum);
System.out.println("View.post视图post被执行了....");
}
});
System.out.println("new子线程执行结束...");
}
}).start();
}
});
**/
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public class ChangeAnsyncTask extends AsyncTask<String, Void, Integer>{
protected Integer doInBackground(String... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int sum=10;
return sum;
}
@Override
protected void onPostExecute(Integer result) {
btn2.setText("变形:"+result);
super.onPostExecute(result);
}
}
很明显上面的代码松耦合,对线程阻塞问题有限的代码封装,更有利于实际开发。