Android拦截 session 错误的通用模式,用屏幕处理错误,在错误前的同一点继续

标签 android android-fragments android-activity error-handling android-jetpack-navigation

我有一个使用 Activity 、 fragment 和 IntentServices 的高效 Android 应用程序。新的需求迫使我集成一个监控/跟踪后端,以跟踪用户在应用程序中执行的操作。为了简化问题图像,每个按钮 .setOnClickListener() 应首先执行 HTTP 后端调用,然后再继续业务逻辑。我使用 swagger 结合我从异步任务调用的 okhttp v.2.7 集成了监控 REST 后端。应用程序的第一步现在是一个登录屏幕,它在后端调用 login(),即创建一个 HTTP session 并保持后端返回的安全 session token 。对后端的每次调用都会自动注入(inject)带有安全 session token 的 HTTP header 。
我还使用 OkHTTP 拦截监听器将请求记录到 Android logcat。
这种方法似乎工作正常,但我遇到了安全 token 过期问题。大约一周后,与后端的 session 到期,Android 应用程序需要启动 HTTP login() 并存储新的安全 session token 。请注意,后端不在我的控制之下(后端的 token 更新不起作用)。
到目前为止,我可以通过调查 OkHTTP ApiException 来处理突然的 session 错误(后端返回 HTTP 代码 403),使用特定的结果代码完成 Activity ,通过导航到登录 Activity 来处理主要 Activity 中的结果代码(当然用户自己必须导航回他在错误发生之前使用的屏幕)。

但是这种方法需要大量代码来处理每种可能的情况,具体取决于调用实体。正如我一开始所说,我正在使用 Activity 、 fragment 和 Intent 服务,每个实体都必须调用后端进行监控/跟踪。因此,错误处理需要针对每个实体进行专门定制,例如 fragment 需要告诉父 Activity 引发和错误。在 Intent 服务中出现错误当然是一个更难的问题。
(对我来说,对于这种情况,Android JetPack 条件导航似乎有点过头了。)

我想知道这种情况是否有一个很好的通用模式,其中异步任务在后端封装跟踪,可以检测错误,显示登录屏幕,然后在成功登录后继续执行该任务。
更一般地说,我想知道,如何拦截异常,暂停当前显示的屏幕( Activity 或 fragment ),显示专用的错误解决屏幕,然后在上一个屏幕上恢复。

最佳答案

这是第一次尝试,每个 Fragment/Activity 需要实现 onPostExecute() 方法来处理特定的错误情况。该解决方案缺乏一种机制,可以在续订 session 后在 navigateToLoginScreenToRenewSession() 之后仅继续执行一行,这是困难的部分。我想知道是否有人对此有很好的解决方案。

public abstract class AbstractAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {

    public boolean isSessionError() {
    // instanceOf for HTTP exception and check for contained HTTP error code
    }

    protected void storeException(Exception e){
    }
}

public class ActuallyDoSomethingTask extends AbstractAsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {
     try{
         // do something
     } catch(Exception e){
         storeException(e);
     }
}

public class SomeActivityUsingHttpSession extends Activity {

    private void onClickListener(){
       new ActuallyDoSomethingTask(){
           // specific implementation for activity / fragment case

           protected void onPostExecute(Void voids){
               if(isSessionError){
                   displayToastWithSessionErrorDescription();
                   navigateToLoginScreenToRenewSession();
                   // TODO continue execution after login screen successfully completed, how can we do that easily without huge boiler plate?
               }
           }
       }.execute()
    }
}

关于Android拦截 session 错误的通用模式,用屏幕处理错误,在错误前的同一点继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271551/

相关文章:

android - 在 Fragment 而不是 Activity 中显示搜索结果

java - 在一个Activity中组织多个Fragment接口(interface)

Android 远程调试不适用于 Windows 7

Android,触摸时停止自动滑入

android - 未找到 ListView 项目

android - 如何在 Android 上的 TabLayout 中以编程方式创建选项卡

android - Dialog.getContext() 和创建对话框的 Activity 之间有区别吗?

java - java中的树状数据结构

android - 如何在不重新启动 Activity 的情况下禁用保持屏幕打开

java - 如何禁用Android中的对话框按钮?