概述
Android在子线程中更新UI的三种方式
新建一个工程
放一个按钮进去,运行如下
1.使用runOnUiTherad()方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_button = (Button) findViewById(R.id.button);
tv_text = (TextView) findViewById(R.id.textView);
bt_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
runOnUiThread(new Runnable() {
@Override
public void run() {
//这里对UI界面进行操作
tv_text.setText("我爱中国");
}
});
}
});
}
点击这个按钮可以看到TextView的值改变了
2.使用Handler的方法,往Handler中发送一个消息,然后当Handler接收到你发送过来的消息,再在Handler执行相应的操作。
private static final int UPDATE_TEXT = 1;
TextView tv_text;
/**
* 新建一个Handel
* 接收button发送的参数
* 对主线程中的UI进行修改
*/
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
//在这里进行UI操作
tv_text.setText("大聪明");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_button = (Button) findViewById(R.id.button);
tv_text = (TextView) findViewById(R.id.textView);
bt_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//新建一个线程
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
//将Message对象发送出去
handler.sendMessage(message);
}
}).start();
}
});
}
- 使用AsyncTask
现在MainActivity中新建一个内部类,这个内部类继承了AsyncTask类,然后重写AsyncTask的内部方法代码如下:
public class MainActivity extends AppCompatActivity {
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_thread = (Button) findViewById(R.id.button);
tv1 = (TextView) findViewById(R.id.textView);
bt_thread.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//启动DownloadTask任务
new DownloadTask().execute();
}
}).start();
}
});
}
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected void onPreExecute() {
//在开始任务之前执行的一个方法
Log.d("MainActivity", "onPostExecute: 我要开始干活啦");
}
@Override
protected Boolean doInBackground(Void... voids) {
//在任务开始时执行的方法
Log.d("MainActivity", "doInBackground: 我在忙,我在忙,我在忙");
//在调用这个方法之后onProgressUpdate会得到执行
publishProgress();
return null;
}
//在doInBackground中调用了publishProgress方法之后,onProgressUpdate会得到执行
@Override
protected void onProgressUpdate(Integer... values) {
Log.d("MainActivity", "onProgressUpdate:我也在忙");
tv1.setText("牛皮");
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Boolean aBoolean) {
//任务执行完毕之后
Log.d("MainActivity", "onPostExecute: 我忙完了");
}
}
}
运行后点击按钮后的效果如下
而日志如下
最后
以上就是舒服期待为你收集整理的Android在子线程中更新UI的三种方式的全部内容,希望文章能够帮你解决Android在子线程中更新UI的三种方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复