如何使用 Toast 提醒用户 OkHttp 请求返回了 200 以外的值?
How to alert the user using Toast that the OkHttp request returned something other than 200?
我正在使用 OkHttp 并且一切正常,但是,我想考虑以下情况:DNS 解析已关闭、服务器已关闭、速度缓慢,或者只是 returns 其他原因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())
从任何后台线程生成主线程处理程序,然后使用它 post 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();
}
});
}
}
我正在使用 OkHttp 并且一切正常,但是,我想考虑以下情况:DNS 解析已关闭、服务器已关闭、速度缓慢,或者只是 returns 其他原因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())
从任何后台线程生成主线程处理程序,然后使用它 post 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();
}
});
}
}