java - 线程退出后调用回调 - Android
问题描述
当我的第二个线程退出时,我找不到从主线程调用我的回调方法的非阻塞方式。
我试图loading.isAlive()
在一个while循环中使用它,但它冻结了屏幕。
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.load_opening_screen);
Thread loading = new LoadingBarThread();
loading.start();
}
private class LoadingBarThread extends Thread {
@Override
public void run() {
for (int i=0;i<=100;i++) {
progressBar.setProgress(i);
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private void callback(){
// start a new activity for example
}
}
当 ProgressBar 达到 100 时,我想开始一项新活动。
解决方案
使用 Handler 对象并在 run() 函数结束时,将 Runnable 发布到该 Handler。让 Runnable 调用回调方法。处理程序将在其附加的线程上执行它(无论它是在哪个线程上创建的)。
所以你的新课程看起来像:
private class LoadingBarThread extends Thread {
Handler handler = new Handler();
@Override
public void run() {
for (int i=0;i<=100;i++) {
progressBar.setProgress(i);
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.post(new Runnable() {
public void run() {
callback();
}
});
}
}
推荐阅读
- html - 上下颠倒的CSS方向?
- spring - Spring boot 2.2.0 升级后导致按占位符读取值的问题
- kubernetes - 总是出现错误:您必须登录到服务器(未经授权)EKS
- c++ - 使用 Boost SML 组成状态机来管理 ASIO 对象和线程的最佳方法是什么?
- bash - 找到如何排除路径
- autohotkey - 切换键盘布局有效但并非总是如此
- php - 如何使用chart.js在php中的饼图或条形图上显示值
- sql - 在字段中查找指定值,但不显示该字段中最后一条记录为“1100”的任何记录
- apache-spark - 在多个数组类型元素之间过滤数据
- php - Datatables() - 在 MySQLi 中通过 AJAX 在 PHP 中分页