我正在使用AsyncTask
将数据从我创建的Web服务中获取。现在我想向用户显示正确的错误消息,就像互联网不可用一样,如果服务器关闭,它将同样显示吐司,它将为此显示吐司。我想在doInBackground()中设置一个错误,如“服务器已关闭”或“发生网络问题”,并在onPostExecute()中显示Toast,但我想知道我的服务器是否已关闭,抛出了什么异常?如果我的服务器处于活动状态,但在传输期间,互联网已断开连接,那么会抛出什么异常?
答案 0 :(得分:0)
对响应建模可能是最好和最简单的方法。
例如,
您可以根据所获得的数据撰写模型,例如:
class ApiResponse {
public final String responseString;
public final Throwable error;
public ApiResponse (String responseString,Throwable error){
this.responseString = responseString;
this.error = error;
}
}
然后,您可以将响应或错误绑定到该模型并从doInBackground();
伪代码:
class ApiAsyncTask extends AsyncTask<Void, Void, ApiResponse> {
....
protected ApiResponse doInBackground() {
try {
//callApi and get response, if success pass null in error
return new ApiResponse(responseString, null)
} catch (Exception e) {
e.printStackTrace();
//otherwise pass that error
return new ApiResponse(null, e);
}
}
protected void onPostExecute(ApiResponse apiResponse) {
//now just need to check if error is null
if (error == null) {
String json = apiResponse.responseString;
//parse response
} else {
//get error and check with instanceOf
Throwable error = apiResponse.error;
if (error instanceOf SocketTimeoutException){
//show timeout error
}
else if (error instanceOf SomeXYZException){
//handle that exception
}
}
}
}
这只是一个例子。您可以在ApiResponse
中放置任何内容,并撰写该数据的模型。 (例如从api获取的状态代码,通过某些转换器生成的json响应的pojo类等等)。一旦数据受限,就可以在onPostExecute()
中使用它,因为它将始终在您的UI线程上运行。请注意,Result
的第三类型参数AsyncTask
是根据定义构建的:AsyncTask<Params, Progress, Result>
。
答案 1 :(得分:0)
将doInBackground()
的例外捕获到字符串中,并且根据您的需要,您可以显示来自onPostExecute()
方法的Toast消息,如下所示:
@Override
protected Void doInBackground(Void... arg0) {
try {
// do you stuff here
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
} catch (IOException e) {
e.printStackTrace();
response = "IOException: " + e.toString();
} finally {
...
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onPostExecute(Void result) {
if (response.contains("IOException: java.net.ConnectException:")) {
Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
mProgressDialog.dismiss();
}
else if (response.contains("IOException: java.net.SocketTimeoutException:")) {
Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
mProgressDialog.dismiss();
}
else if (response.contains("IOException: java.net.SocketException:")) {
Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
mProgressDialog.dismiss();
}
}
当然,这只是一个例子,但你可以看到如何解决这个问题。