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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView tv;
private Button button1,button2,button3,button4;
private Handler myHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
String tv_text=(String) msg.obj;
tv.setText(tv_text);
break;
default:
break;
}
}
};
private MyTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button4.setEnabled(false);
}
/**
* 在子线程中调用runOnUIThread()方法更新UI
*/
private void changeUiByOnUIThread() {
new Thread(){
@Override
public void run() {
try {
sleep(2000);//睡眠2s
//不能在子线程中修改UI,不然程序会报错:
/**
* android.view.ViewRootImpl$CalledFromWrongThreadException:
* Only the original thread that created a view hierarchy can touch its views.
*/
// tv.setText("This is change by OnUIThread!!!");
/**
* 使用Acitivity的runOnUiThread方法执行代码时,可以保证所有的代码都在UI线程中执行
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("This is change by OnUIThread!!!");
}
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
/**
* 在子线程中使用Handler更新UI
*/
private void changeUiByHandler(){
new Thread(){
@Override
public void run() {
Message msg = myHandler.obtainMessage(0);
msg.obj = "This is change by Handler!!!";
myHandler.sendMessageDelayed(msg, 2000);//延迟2s
}
}.start();
}
/**
* 使用AsynTask更新UI
*/
private void changeUiByAsyncTask(){
task = new MyTask();
task.execute();
button3.setEnabled(false);
button4.setEnabled(true);
}
/**
* 参数解释:
* 第一个参数:对应doInBackground()方法的参数
* 第二个参数:对应onProgressUpdate()方法的参数
* 第三个参数:对应onPostExecute()方法的参数
*
* 在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
*/
private class MyTask extends AsyncTask
{
/**
* onPreExecute方法用于在执行后台任务前做一些UI操作
*/
@Override
protected void onPreExecute() {
tv.setText("loading");
}
/**
* doInBackground方法内部执行后台任务,不可在此方法内修改UI
*/
@Override
protected String doInBackground(Void... params) {
int times=10;
int process=0;
while(times>0){
process+=10;
publishProgress(process);
// 这里调用的就是onProgressUpdate(Integer... values)
times--;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "执行完毕!!!";// 这里返回的String类型数据会当作onPostExecute()方法的参数
}
/**
* onProgressUpdate方法用于更新进度信息,这个方法可以被调用多次
*/
@Override
protected void onProgressUpdate(Integer... values) {
tv.setText(values[0]+"");
}
/**
* onPostExecute方法用于在执行完后台任务后更新UI,显示结果
*/
@Override
protected void onPostExecute(String result) {
tv.setText(result);
button3.setEnabled(true);
button4.setEnabled(false);
}
/**
* onCancelled方法用于在取消执行中的任务时更改UI
* 当调用AsyncTask.cancel(true)方法时,就会执行到这个方法。
*/
@Override
protected void onCancelled() {
tv.setText("取消执行!!!");
button3.setEnabled(true);
button4.setEnabled(false);
}
}
/**
* 取消异步任务
*/
private void cancelAsyncTask(){
task.cancel(true);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
changeUiByOnUIThread();
break;
case R.id.button2:
changeUiByHandler();
break;
case R.id.button3:
changeUiByAsyncTask();
break;
case R.id.button4:
cancelAsyncTask();
break;
default:
break;
}
}
}
runOnUIThread、Handler、AsyncTask与子线程结合使用更新UI
最新推荐文章于 2021-08-13 10:28:22 发布