android - 如何使用 Toast 提醒用户 OkHttp 请求返回了 200 以外的值?

标签 android okhttp android-toast

我正在使用 OkHttp 并且一切正常,但是,我想考虑以下情况:DNS 解析关闭、服务器关闭、速度缓慢,或者只是返回 HTTP 状态代码 200 以外的内容。 我试过使用 Toast,但我不能,因为这是在另一个线程上完成的(?)。 我如何克服这个障碍并为用户提供更好的体验? 这是我的代码:

private void getBinary(String text) throws Exception {
    OkHttpClient client = new OkHttpClient();

    String body = URLEncoder.encode(text, "utf-8");
    // Encrypt
    MCrypt mcrypt = new MCrypt();
    String encrypted = MCrypt.bytesToHex(mcrypt.encrypt(body));
    Request request = new Request.Builder()
        .url("http://mysite/my_api.php")
        .post(RequestBody.create(MediaType.parse("text/plain"), encrypted))
        .addHeader("User-Agent", System.getProperty("http.agent"))
        .build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onResponse(Response response) throws IOException, RuntimeException {
            if (response.code() != 200){
                Toast.makeText(getSherlockActivity(), "Fail", Toast.LENGTH_LONG).show();
                return;
            }
            saveResponseToFile(response);
        }

        @Override
        public void onFailure(Request arg0, IOException arg1) {
            Toast.makeText(getSherlockActivity(), "Bigger fail", Toast.LENGTH_LONG).show();
        }
    });
}

这是崩溃:

FATAL EXCEPTION: OkHttp Dispatcher
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

最佳答案

Toast 必须显示在主线程上。您可以使用 new Handler(Looper.getMainLooper()) 从任何后台线程生成主线程处理程序,然后使用它将 toast 工作发布到主线程。

这样的代码适用于您的:

public static void backgroundThreadShortToast(final Context context,
        final String msg) {
    if (context != null && msg != null) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

关于android - 如何使用 Toast 提醒用户 OkHttp 请求返回了 200 以外的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736880/

相关文章:

android - 主线程上的网络连接 - 在这种情况下的替代方案?

java - Android Toast 不显示

android - Android 中的 float 透明窗口

java - 变量更改时更新 UI

android - 是否可以将文件放在 Android AVD 的 'Downloads' 文件夹中?

客户端证书的Android okhttp3错误

java - 如何使用 OkHttp 设置连接超时

java - 启动服务不起作用

java - 值引擎不是对象 android.speech.tts.TextToSpeech 的成员

android - 控制toast的显示时间