Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义视图是否可以知道已调用onPause?_Android_Multithreading_Custom View - Fatal编程技术网

Android 自定义视图是否可以知道已调用onPause?

Android 自定义视图是否可以知道已调用onPause?,android,multithreading,custom-view,Android,Multithreading,Custom View,我有一个自定义视图,它运行一个线程操作,定期调用interwebs。我想知道是否有一种方法可以让我不必从父活动(onPause)中终止该线程,这样该线程就不会在活动被后台(和/或终止)后在后台游荡 这里的目的是使自定义视图能够自给自足,并且不需要来自活动的额外处理。这样做的方法是,当其父线程处于后台时,它监听,然后让线程中的无限睡眠循环终止。我没有看到这样做的方法,但我希望我忽略了一些事情。要么你必须让你的视图知道拥有的活动不再在前台,要么用某种方法轮询系统,查询当前在前台的任务,这似乎效率很低

我有一个自定义视图,它运行一个线程操作,定期调用interwebs。我想知道是否有一种方法可以让我不必从父活动(onPause)中终止该线程,这样该线程就不会在活动被后台(和/或终止)后在后台游荡


这里的目的是使自定义视图能够自给自足,并且不需要来自活动的额外处理。这样做的方法是,当其父线程处于后台时,它监听,然后让线程中的无限睡眠循环终止。我没有看到这样做的方法,但我希望我忽略了一些事情。

要么你必须让你的视图知道拥有的活动不再在前台,要么用某种方法轮询系统,查询当前在前台的任务,这似乎效率很低

以下是解决此问题的两个链接:


(这可能不是一个真正的答案,但它太大了,无法发表评论)

除非您直接通知它。

出于您的目的,重写
View.ondAttachedFromWindow()
,并在那里放弃线程。然后,当视图再次可见时,在
view.onAttachedToWindow()
中重新旋转线程。onPause()和onResume()的问题在于,您仍然可以拥有一个在屏幕上可见但附加到已暂停活动的视图。发生这种情况的一个例子是,窗口中的一个活动覆盖了另一个活动


或者,正如william gouvea所说,片段可能更适合你的目的,因为它已经有了暂停和恢复的生命周期挂钩,与网络对话的任何内容实际上都属于控制器领域。

如果您只需覆盖View类并创建自己的CustomView,则可以创建一个接口作为侦听器,该接口应由您的父活动实现,因此,当某些事情发生时,您会触发事件并在这些组件之间建立来回通信

根据您想要实现的目标,片段可能会很有用,因为此组件有自己的生命周期,类似于活动(例如onPause/onResume),保存您自己的状态,有无视图,并且可以在配置切面之间保留它们的状态

更多信息,请参阅:

是的,您可以使用下面的代码

是的,你可以。 您只需要有一个LifecycleOwner类型的字段。 更多关于它的信息,请访问。 在我的例子中,我创建了一个自定义视图,其中包含来自第三方库的另一个视图-CameraView

首先,自定义视图需要实现LifecycleOver接口

public class MakePhotoView extends ConstraintLayout implements LifecycleObserver
因此,我的自定义视图中有一个字段:

private LifecycleOwner mLifecycleOwner;
我将其作为参数之一传递给构造函数:

public MakePhotoView(Context context, OnPhotoMadeListener onPhotoMadeListener, LifecycleOwner lifecycleOwner) {
    super(context);
    mOnPhotoMadeListener = onPhotoMadeListener;
    mLifecycleOwner = lifecycleOwner;
    init();
}
之后,我将自定义视图注册为LifecycleOwner中生命周期事件的观察者:

private void init() {
    //other code
    mLifecycleOwner.getLifecycle().addObserver(this);
}
最后,我可以收听生命周期事件:

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void startCamera() {
    AppLog.logObject(this, "On Resume called for MakeCameraView");
    mCameraView.start();
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void stopCamera() {
    AppLog.logObject(this, "On Pause called for MakeCameraView");
    mCameraView.stop();
}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyCamera() {
    AppLog.logObject(this, "On Destroy called for MakeCameraView");
    mCameraView.destroy();
}

如果
Build.VERSION.SDK\u INT

@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
    super.onVisibilityChanged(changedView, visibility);
    if (visibility == View.VISIBLE) //onResume called
    else // onPause() called
}
@Override
public void onVisibilityAggregated(boolean isVisible) {
    super.onVisibilityAggregated(isVisible);
    if (isVisible) //onresume() called
    else // onPause() called
}
然后
Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.N

@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
    super.onVisibilityChanged(changedView, visibility);
    if (visibility == View.VISIBLE) //onResume called
    else // onPause() called
}
@Override
public void onVisibilityAggregated(boolean isVisible) {
    super.onVisibilityAggregated(isVisible);
    if (isVisible) //onresume() called
    else // onPause() called
}

您可以阅读的源代码以获得想法。

附加/分离的生命周期并不严格模仿创建/销毁生命周期。但是,如果附加了视图,则会创建视图的活动。但是,在分离视图后,其活动不一定会被破坏。尝试切换“最近”菜单。注意:当显示“活动选项”菜单溢出弹出窗口时,窗口也会失去焦点(并调用onWindowFocusChanged(false))。我曾经在onWindowFocusChanged()中刷新ListView,这有一个不幸的副作用,就是丢失选定的项目,这很烦人,尤其是在ActionMode的溢出菜单中。因此,我正在考虑使用Application.registerActivityLifecycleCallbacks()并对所有感兴趣的视图进行某种回调(例如,通过实现一些接口)。提供的代码可能存在潜在问题:它可能会得到多个
onPause
onResume
事件。e、 g.视图可见性已更改为不可见,然后窗口失去焦点,视图将在暂停时获得2
on
。添加解决方案并更新答案,我将批准您的更改完美技巧谢谢;添加有关何时调用这些方法的信息:*切换应用程序时视图的生命周期(因此在活动级别调用onPause/onResume)*退出应用程序:*E/PictureChooser:onWindowFocusChanged FALSE case*E/PictureChooser:onVisibilityChanged GONE case*返回应用程序:*E/PictureChooser:onVisibilityChanged VISIBLE case*E/PictureChooser:onWindowFocusChanged TRUE case
onDetachedFromWindow()当应用程序通过按下Home(主页)按钮进行后台处理时,不必调用