如何捕获Retrofit android中的异常

2023-12-15

  1. 我已将类定义如下。
  2. 我在这里使用了 dagger 和 Retrofit

我正在尝试做什么::

我正在努力抓住OfflineException在下面的请求中,如何在主活动中正确捕获它。


请求拦截器.java

public class RequestInterceptor implements Interceptor {

    ConnectivityManager connectivityManager;
    Application mApplication;

    @Inject
    public RequestInterceptor(Application mApplication) {
        this.mApplication = mApplication;
        connectivityManager = (ConnectivityManager) mApplication.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        if (isConnected()) {
            throw new OfflineException();
        }

        Request.Builder r = chain.request().newBuilder();
        return chain.proceed(r.build());
    }

    protected boolean isConnected() {
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnectedOrConnecting();
    }

    public class OfflineException extends IOException {

        @Override
        public String getMessage() {
            return mApplication.getResources().getString(R.string.app_no_connectivity);
        }

    }

}

网络模块.java

import android.app.Application;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.concurrent.TimeUnit;

import javax.inject.Singleton;

import commons.LinksAndKeys;
import dagger.Module;
import dagger.Provides;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import retrofitDagger.retrofitUtils.RequestInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;


@Module
public class NetModule {

    String mBaseUrl;
    Application mApplication;

    // Constructor needs one parameter to instantiate.
    public NetModule(String baseUrl, Application application) {
        this.mBaseUrl = baseUrl;
        this.mApplication = application;
    }

    // Dagger will only look for methods annotated with @Provides
    @Provides
    @Singleton
    // Application reference must come from AppModule.class
    SharedPreferences providesSharedPreferences(Application application) {
        return PreferenceManager.getDefaultSharedPreferences(application);
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return mApplication;
    }

    @Provides
    @Singleton
    Cache provideOkHttpCache(Application application) {
        int cacheSize = 10 * 1024 * 1024; // 10 MiB
        Cache cache = new Cache(application.getCacheDir(), cacheSize);
        return cache;
    }

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

    @Provides
    @Singleton
    OkHttpClient provideOkHttpClient(Cache cache) {
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.cache(cache);
        client.addInterceptor(new  RequestInterceptor(mApplication));
        client.readTimeout(LinksAndKeys.READ_TIMEOUT, TimeUnit.SECONDS);
        client.connectTimeout(LinksAndKeys.CONNECTION_TIMEOUT, TimeUnit.SECONDS);
        return client.build();
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
        return retrofit;
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Inject
    Retrofit retrofit;
    TextView textView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((App) getApplication()).getNetComponent().inject(this);

        //Create textview and findViewByID
        textView = (TextView) findViewById(R.id.textview_post);
        //Create a retrofit call object
        Call<List<Post>> posts = retrofit.create(Restapi.class).getPosts();

        //Enque the call
        posts.enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
               //Set the response to the textview
                textView.setText(response.body().get(0).getBody());

            }

            @Override
            public void onFailure(Call<List<Post>> call, Throwable t) {
                //Set the error to the textview
                textView.setText(t.toString());
            }
        });
    }
}

据我所知,没有互联网连接,RetrofitError 包含 ConnectionException 作为原因。

public class RetrofitErrorHandler implements ErrorHandler {

    @Override
    public Throwable handleError(RetrofitError cause) {
        if (cause.isNetworkError()) {
            if (cause.getCause() instanceof SocketTimeoutException) {
                  /* your code here*/ 
                return new MyConnectionTimeoutException();
            } else {
                /* your code here*/
                return new MyNoConnectionException();
            }
        } else {
            //Do whatever you want to do if there is not a network error.  
        }
    }
}

或者,您可以创建一个自定义 Retrofit 客户端,在执行请求之前检查连接并引发异常。

public class ConnectivityCheck implements Client {

    Logger log = LoggerFactory.getLogger(ConnectivityCheck.class);

    public ConnectivityCheck (Client wrappedClient, NetworkConnectivityManager ncm) {
        this.wrappedClient = wrappedClient;
        this.ncm = ncm;
    }

    Client wrappedClient;
    private NetworkConnectivityManager ncm;

    @Override
    public Response execute(Request request) throws IOException {
        if (!ncm.isConnected()) {
            log.debug("No connectivity %s ", request);
            throw new NoConnectivityException("No connectivity");
        }
        return wrappedClient.execute(request);
    }
}

然后在配置RestAdapter时使用它

RestAdapter.Builder().setEndpoint(serverHost)
                     .setClient(new ConnectivityCheck(new OkHttpClient(), ...))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何捕获Retrofit android中的异常 的相关文章

  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时

随机推荐

  • Java中如何快速截图?

    我正在实现一个简单的眼动仪 它需要在从网络摄像头捕获视频的同时快速截取屏幕上发生的情况 问题是用机器人来做这件事的方式 这里提到 https stackoverflow com questions 2475303 java library
  • 购物车中每个产品类别仅允许一种产品

    On this 问题 答案我找到了有关如何在 Woocommerce 中的购物车中为每个类别添加一个产品的 PHP 代码 该代码工作得很好 但我想将最新添加的产品添加到购物车 如果购物车中已经有该类别的产品 我想删除最旧的产品 add fi
  • 如何使用 vuetify 使字体大小响应?

    In vuetify他们有排版辅助类 例如 display 4货物用于h1 这是完整列表 当我为某些元素选择 display 1 时 在所有分辨率中 该类都会获得相同的字体大小 34px 我本来期待 display 4屏幕宽度为 1024
  • Spring Cloud Stream @SendTo注释不起作用

    我正在将 Spring Cloud Stream 与 Spring Boot 结合使用 我的应用程序非常简单 示例服务 类 EnableBinding Processor1 class Service public class Exampl
  • 仅用于文件大小的 Windows 命令

    是否有 Windows 命令可以像这样输出指定文件的大小 以字节为单位 gt filesize test jpg 65212 我知道dir命令输出此信息 但它也输出其他信息 我可以轻松编写这样的程序 但如果可能的话 我更愿意使用本机 Win
  • PHP-如何在数组内合并数组[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 php中如何合并n个数组我的意思是我怎样才能完成这样的工作 array merge from result 0 to result count result 1 OR array me
  • Winforms:如何使用C#将图片上传到SQL Server数据库

    我想将图像上传到我的 SQL Server 数据库 我有两个按钮 一个图片框 使用浏览按钮 我可以从磁盘中选择文件 并将其显示在图片框中 问题是我无法将图片从图片框保存到数据库中 请帮我解决代码 欣赏它 您可以直接从其路径保存图像 您已经拥
  • python pandas 中的分块文件上的数百万个键上的 grouby 出现问题

    我有一个非常大的 CSV 文件 数十千兆 其中包含带有以下列的网络日志 user id time stamp category clicked 我必须构建一个记分器来识别用户喜欢和不喜欢的类别 请注意 我有超过 1000 万用户 我首先把它
  • 将转换器绑定到 Windows Phone 8 应用程序中的 XAML

    我的 xaml 页面代码
  • Math.max 和 Math.min 输出允许的最高和最低值

    所以我试图制作一个程序来输出总和 平均值 最小值和最大值 我基本上已经弄清楚了除了最小和最大值输出 2147483647 和 2147483647 之外的所有内容 我相信这是 Java 将计算的绝对最小和最大值 无论如何 我想计算用户输入的
  • 如何在警报对话框中设置警报文本大小

    默认情况下的警报消息对于屏幕较小的特定设备来说太大 我想将其设置为自定义 dp 我的警报是这样的 OnClickListener addNewItemListener new OnClickListener public void onCl
  • 嵌入仅限 Perl 的模块以及嵌入式 Perl 解释器

    我跟着https perldoc perl org perlembed并成功建立了interp二进制 当我使用static ext 输出目录有 pm文件安装到前缀目录中 如何添加自定义简单 pm模块如TLUtils pm无需将模块文件解压到
  • Python,字符串中字符的具体计数

    我正在尝试计算 python 中字符串出现的次数 我想采用二进制输入 例如 001101 然后计算 1 0 11 00 等的数量 我试图通过使用 count 来实现这一点 但是当我只希望它输出 1 1 和 1 11 时 这会输出有 3 个
  • Python 2.x 可选子解析器 - 错误参数太少

    我一直在尝试设置一个带有两个子解析器的主解析器 以便在单独调用时 主解析器会显示一条帮助消息 def help message print help message import argparse parser argparse Argum
  • C 中二分查找的第一次和最后一次出现

    我试图了解如何修改二进制搜索 使其适用于第一次和最后一次出现 当然我可以在网上找到一些代码 但我试图深入理解 这里是一些基本的非递归二进制搜索我发现 int BinarySearch int array int number of elem
  • 更改快速选择器的悬停颜色

    是否可以通过设置更改快速选择器所选选项的颜色 要保留当前主题并仅更改此颜色 请在设置中找到 工作台 颜色自定义 然后单击 在 settings json 中编辑 然后将以下内容添加到屏幕右侧的用户设置中 workbench colorCus
  • 推荐的c# winform控件包[关闭]

    Closed 这个问题是无关 目前不接受答案 我正在寻找商业 免费推荐的 c winform 控件包 开发快递 我试过了组件一 DevExpress 和Telerik
  • 将 NSString 绘制到 UIImage

    我有一个 NSString 对象 我想将其写入现有的 UIImage 对象 UIImage 对象已经有一些与之关联的图像 我想将字符串写入同一张图像 我如何实现它 编辑 以下是实现编辑 UIImage 并在其上写入文本的基本步骤 从 UII
  • Tomcat 使用 Windows 证书存储进行 SSL

    我使用 Tomcat 9 0 10 并希望使用 Windows 证书存储来保存 SSL 私钥和证书 有这里是另一个线程 这似乎有答案 但是启动 Tomcat 时出现异常 我的 server xml 如下所示
  • 如何捕获Retrofit android中的异常

    我已将类定义如下 我在这里使用了 dagger 和 Retrofit 我正在尝试做什么 我正在努力抓住OfflineException在下面的请求中 如何在主活动中正确捕获它 请求拦截器 java public class RequestI