我有一个片段,它设置一个列表视图,并创建一个处理程序来定期更新列表视图。然而,看起来处理程序在片段被销毁后仍然运行。
以下是代码。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//boilerplate code
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
assignAdapter();
handler.postDelayed(this, 15000);
}
});
return v;
}
在片段
被销毁后更新ListView
会导致应用程序崩溃。如何在片段
被销毁时使Handler
停止?我还想知道如果应用程序的任何暂停对Handler
也有什么影响。
使用片段的WeakReference停止处理程序的另一种方法:
static final class UpdateUIRunnable implements Runnable {
final WeakReference<RouteGuideFragment> weakRefToParent;
final Handler handler;
public UpdateUIRunnable(RouteGuideFragment fragment, Handler handler) {
weakRefToParent = new WeakReference<RouteGuideFragment>(fragment);
this.handler = handler;
}
public void scheduleNextRun() {
handler.postDelayed(this, INTERVAL_TO_REDRAW_UI);
}
@Override
public void run() {
RouteGuideFragment fragment = weakRefToParent.get();
if (fragment == null || fragment.hasBeenDestroyed()) {
Log.d("UIUpdateRunnable", "Killing updater -> fragment has been destroyed.");
return;
}
if (fragment.adapter != null) {
try {
fragment.adapter.forceUpdate();
} finally {
// schedule again
this.scheduleNextRun();
}
}
}
}
其中<代码>片段。hasBeenDestroyed()只是片段的mDestroyed属性的一个getter:
@Override
public void onDestroy() {
super.onDestroy();
mDestroyed = true;
}
您需要在片段中存储对处理程序和runnable的引用,然后当片段被破坏时,您需要从传递runnable的处理程序中删除回调。
private Handler mHandler;
private Runnable mRunnable;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//boilerplate code
mRunnable = new Runnable() {
@Override
public void run() {
assignAdapter();
handler.postDelayed(this, 15000);
}
};
mHandler = new Handler(mRunnable);
mHandler.post();
return v;
}
@Override
public void onDestroy() {
mHandler.removeCallbacks(mRunnable);
super.onDestroy();
}
您需要实现这样的处理程序
private Handler myHandler;
private Runnable myRunnable = new Runnable() {
@Override
public void run() {
//Do Something
}
};
@Override
public void onDestroy () {
mHandler.removeCallbacks(myRunnable);
super.onDestroy ();
}
问题内容: 我通过以下方式创建了线程服务: 关闭应用程序后,电话的工作速度非常慢,我猜这是由于线程终止失败引起的。 有谁知道在终止应用程序之前终止所有线程的最佳方法是什么? 问题答案: 附录 :Android框架为一次性工作,后台工作等提供了许多帮助程序,与在许多情况下尝试滚动自己的线程相比,它们可能更可取。如下面的文章所述,AsyncTask是一个很好的起点。我鼓励读者在开始考虑自己编写线程之前
问题内容: 在我的组织中,我们有许多Redis工作人员来完成我们的关键任务。通常,一天一次或两次,我们的工人会停止处理队列。 该代码基本上如下所示: 如果看到的话,就代码而言,发生的事情并不多,但是每隔一段时间,队列就会开始建立,并且工作程序不会从队列中弹出任何项目。为设置超时根本没有用,因为我们假设问题出在Redis客户端连接上。 目前,我们已经建立了一些侦听器,这些侦听器会在队列建立时提醒我们
Android不会在焦点编辑文本中显示键盘,即使当点击它时,在暂停或停止片断后也是如此。例如我专注于编辑文本键盘显示,一切都好,然后我点击home按钮(或者只是离开片段)恢复相同的片段后,焦点仍然在编辑文本,但不能再次显示键盘。来自日志: w/InputMethodManager:当前服务视图不是焦点视图 我只有一个活动,在清单中包含以下信息: 活动Android:name=“.Presentat
我有一个带有片段页面管理器的视图页面管理器,我的应用程序以前只使用了两个片段(不同类型的)而没有问题。 不过,我刚刚添加了第三个片段,现在当我远离它们时,我的适配器/视图寻呼机似乎正在破坏我的片段。例如,如果我在第1页,当我靠近它时,第3页会被销毁并重新创建。如果我在第3页,第1页也会发生同样的事情。 这会导致我的应用出现很多问题。这些碎片根本不是RAM,所以我如何阻止这种情况发生?
问题内容: 我试图弄清楚为什么一旦尝试在线程完成后再次运行线程,此代码就会崩溃。 我第一次单击“开始5个线程”,它运行正常并完成。但是,如果我再次单击它。整个程序崩溃,我得到QThread:线程仍在运行时被销毁错误 可以在网上找到此代码。我正在尝试从中学习。 问题答案: 通过让他作为父母自己来解决这个问题。您必须更改: 至: