【问题标题】:Fragment view changes and volley response片段视图变化和截击响应
【发布时间】:2017-08-28 04:51:33
【问题描述】:

我有一个调用 http volley 请求并更新进度条的片段。

进度条会根据要调用的剩余请求进行更新。

某些情况,如用户在片段上按下后退按钮,控件会引发空引用异常。我提到了生命周期并了解到至少必须进行检查以确保片段是否仍然存在/可见。

只是想确保在每次调用控件之前检查 this.isVisible 是否足够在凌空响应中,或者是否有任何其他好的通用解决方案实现这个?

堆栈跟踪如下:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setProgress(int)' on a null object reference
       at grosspad.pmsquaresoft.com.expensemanager.fragments.sync.SyncProgressFragment.onMyGroupUsersDownloadComplete(SyncProgressFragment.java:245)
       at grosspad.pmsquaresoft.com.expensemanager.serverapi.GrossPadApiProxy$43.onResponse(GrossPadApiProxy.java:706)
       at grosspad.pmsquaresoft.com.expensemanager.serverapi.GrossPadApiProxy$43.onResponse(GrossPadApiProxy.java:701)
       at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
       at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
       at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
       at android.os.Handler.handleCallback(Handler.java:742)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:5527)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)

【问题讨论】:

  • 请发布堆栈跟踪
  • @mzeus.bolt,完成。谢谢
  • 我认为检查生命周期阶段没有意义。你为什么不检查一下 if(progressBar != null){progressBar.setProgress(progress);}
  • @piotrpo,检查 null 就像在发生某些事情后进行修补。所以我更喜欢取消 onDestroyView 中的回调。你觉得有道理吗?
  • ok - 销毁视图为时已晚 - 注册/注销与 UI 交互的回调的常见位置是 onResume() / onPause() 方法

标签: android android-fragments android-volley


【解决方案1】:

根据stacktrace,这表明你的Fragment不可见,并且仍在接收回调。

在接收进度回调时,您可以检查您的 ProgressBar 是否不为空,然后仅在您的 Fragment 从 @987654324 中删除时更新 ProgressBar 删除回调并取消任务@ IE;在onDestroyView() 方法中。当且仅当您的任务是 Fragment 特定的。

否则,您可以转到AsyncTaskLoader 并下载数据,它将在后台运行,直到您的操作完成。

谢谢

【讨论】:

  • 我认为删除 onDestroyView 中的回调是正确的,因为它实际上消除了问题的根本原因。并且检查 != null 只是一种补丁,对吗?
  • 是的,正确。检查 not null 是补丁,但是当您执行密集操作(例如下载用户数据以供应用程序运行)时,需要这样做以避免不必要的回调。
  • 如果答案有助于解决您的问题。请将其标记为已接受或投赞成票。其他开发人员也可以从中获得帮助。谢谢@Muthu
  • 将在实施和测试后执行。可能需要几天时间。但肯定会回来更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多