Handle Server Response in Android
-
28-10-2019 - |
Pergunta
In my application I am fetching data using webservices.But when the server is down or not in active state it gives response code 500 and my application force close.
Please guide me how to handle this condition in my application.The logcat output is shown below :
12-05 12:17:22.337: V/response code(950): 500
12-05 12:17:22.347: W/System.err(950): org.json.JSONException: A JSONArray text must start with '[' at character 1 of <html>
12-05 12:17:22.347: W/System.err(950): <head>
12-05 12:17:22.347: W/System.err(950): <title>Configuration Error</title>
12-05 12:17:22.347: W/System.err(950): <style>
12-05 12:17:22.347: W/System.err(950): body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
12-05 12:17:22.347: W/System.err(950): p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
12-05 12:17:22.347: W/System.err(950): b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
12-05 12:17:22.347: W/System.err(950): H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
12-05 12:17:22.347: W/System.err(950): H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
12-05 12:17:22.356: W/System.err(950): pre {font-family:"Lucida Console";font-size: .9em}
12-05 12:17:22.356: W/System.err(950): .marker {font-weight: bold; color: black;text-decoration: none;}
12-05 12:17:22.356: W/System.err(950): .version {color: gray;}
12-05 12:17:22.356: W/System.err(950): .error {margin-bottom: 10px;}
12-05 12:17:22.356: W/System.err(950): .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
12-05 12:17:22.356: W/System.err(950): </style>
12-05 12:17:22.356: W/System.err(950): </head>
12-05 12:17:22.356: W/System.err(950):
12-05 12:17:22.356: W/System.err(950): <body bgcolor="white">
12-05 12:17:22.366: W/System.err(950):
12-05 12:17:22.366: W/System.err(950): <span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
12-05 12:17:22.366: W/System.err(950):
12-05 12:17:22.366: W/System.err(950): <h2> <i>Configuration Error</i> </h2></span>
12-05 12:17:22.366: W/System.err(950):
12-05 12:17:22.366: W/System.err(950): <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
12-05 12:17:22.366: W/System.err(950):
12-05 12:17:22.366: W/System.err(950): <b> Description: </b>An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
12-05 12:17:22.377: W/System.err(950): <br><br>
12-05 12:17:22.377: W/System.err(950):
12-05 12:17:22.377: W/System.err(950): <b> Parser Error Message: </b>Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.<br><br>
12-05 12:17:22.377: W/System.err(950):
12-05 12:17:22.377: W/System.err(950): <b>Source Error:</b> <br><br>
12-05 12:17:22.377: W/System.err(950):
12-05 12:17:22.377: W/System.err(950): <table width=100% bgcolor="#ffffcc">
12-05 12:17:22.377: W/System.err(950): <tr>
12-05 12:17:22.377: W/System.err(950): <td>
12-05 12:17:22.377: W/System.err(950): <code><pre>
12-05 12:17:22.377: W/System.err(950):
12-05 12:17:22.377: W/System.err(950): Line 30: <error statusCode="404" redirect="filenotfound.htm" />
12-05 12:17:22.377: W/System.err(950): Line 31: </customErrors>
12-05 12:17:22.377: W/System.err(950): <font color=red>Line 32: <compilation debug="true" targetFramework="4.0">
12-05 12:17:22.396: W/System.err(950): </font>Line 33: <expressionBuilders>
12-05 12:17:22.396: W/System.err(950): Line 34: <add expressionPrefix="NopResources" type="NopSolutions.NopCommerce.BusinessLogic.Localization.NopResourceExpressionBuilder, Nop.BusinessLogic" /></pre></code>
12-05 12:17:22.396: W/System.err(950):
12-05 12:17:22.396: W/System.err(950): </td>
12-05 12:17:22.396: W/System.err(950): </tr>
12-05 12:17:22.396: W/System.err(950): </table>
12-05 12:17:22.396: W/System.err(950):
12-05 12:17:22.396: W/System.err(950): <br>
12-05 12:17:22.396: W/System.err(950):
12-05 12:17:22.396: W/System.err(950): <b> Source File: </b> C:\Websites\balajeebazaar\web.config<b> Line: </b> 32
12-05 12:17:22.396: W/System.err(950): <br><br>
12-05 12:17:22.396: W/System.err(950):
12-05 12:17:22.396: W/System.err(950): <hr width=100% size=1 color=silver>
12-05 12:17:22.407: W/System.err(950):
12-05 12:17:22.407: W/System.err(950): <b>Version Information:</b> Microsoft .NET Framework Version:2.0.50727.4963; ASP.NET Version:2.0.50727.4955
12-05 12:17:22.407: W/System.err(950):
12-05 12:17:22.407: W/System.err(950): </font>
12-05 12:17:22.407: W/System.err(950):
12-05 12:17:22.416: W/System.err(950): </body>
12-05 12:17:22.416: W/System.err(950): </html>
12-05 12:17:22.416: W/System.err(950): <!--
12-05 12:17:22.416: W/System.err(950): [ConfigurationErrorsException]: Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. (C:\Websites\balajeebazaar\web.config line 32)
12-05 12:17:22.416: W/System.err(950): at System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags)
12-05 12:17:22.416: W/System.err(950): [HttpException]: Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. (C:\Websites\balajeebazaar\web.config line 32)
12-05 12:17:22.416: W/System.err(950): at System.Web.HttpRuntime.FirstRequestInit(HttpContext context)
12-05 12:17:22.416: W/System.err(950): at System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)
12-05 12:17:22.416: W/System.err(950): at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
12-05 12:17:22.416: W/System.err(950): --><!--
12-05 12:17:22.426: W/System.err(950): This error page might contain sensitive information because ASP.NET is configured to show verbose error messages using <customErrors mode="Off"/>. Consider using <customErrors mode="On"/> or <customErrors mode="RemoteOnly"/> in production environments.-->
12-05 12:17:22.426: W/System.err(950): at org.json.JSONTokener.syntaxError(JSONTokener.java:448)
12-05 12:17:22.426: W/System.err(950): at org.json.JSONArray.<init>(JSONArray.java:104)
12-05 12:17:22.426: W/System.err(950): at org.json.JSONArray.<init>(JSONArray.java:150)
12-05 12:17:22.426: W/System.err(950): at cm.bzaar.CallWebservices.getCategory(CallWebservices.java:48)
12-05 12:17:22.426: W/System.err(950): at cm.bzaar.CategoryActivity$Loader.doInBackground(CategoryActivity.java:98)
12-05 12:17:22.426: W/System.err(950): at cm.bzaar.CategoryActivity$Loader.doInBackground(CategoryActivity.java:1)
12-05 12:17:22.436: W/System.err(950): at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-05 12:17:22.436: W/System.err(950): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
12-05 12:17:22.436: W/System.err(950): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
12-05 12:17:22.436: W/System.err(950): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
12-05 12:17:22.436: W/System.err(950): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
12-05 12:17:22.436: W/System.err(950): at java.lang.Thread.run(Thread.java:1060)
12-05 12:17:22.436: W/dalvikvm(950): threadid=17: thread exiting with uncaught exception (group=0x4001aa28)
12-05 12:17:22.446: E/AndroidRuntime(950): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
12-05 12:17:22.446: E/AndroidRuntime(950): java.lang.RuntimeException: An error occured while executing doInBackground()
12-05 12:17:22.446: E/AndroidRuntime(950): at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.lang.Thread.run(Thread.java:1060)
12-05 12:17:22.446: E/AndroidRuntime(950): Caused by: java.lang.NullPointerException
12-05 12:17:22.446: E/AndroidRuntime(950): at cm.bzaar.CategoryActivity$Loader.doInBackground(CategoryActivity.java:100)
12-05 12:17:22.446: E/AndroidRuntime(950): at cm.bzaar.CategoryActivity$Loader.doInBackground(CategoryActivity.java:1)
12-05 12:17:22.446: E/AndroidRuntime(950): at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-05 12:17:22.446: E/AndroidRuntime(950): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
12-05 12:17:22.446: E/AndroidRuntime(950): ... 4 more
SEE FOLLOWING CODE :
code segment where function is called to call webservice :
@Override
protected Void doInBackground(Void... arg0) {
CategoryArray = new JSONArray();
CategoryArray = CW
.getCategory("url");
for (int i = 0; i <= CategoryArray.length() - 1; i++) {
try {
Log.v("category array : ", CategoryArray.getString(i));
String[] val = CategoryArray.getString(i).split("•");
CategoryID.add(i, val[0]);
CategoryList.add(i, val[1]);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter = new CategoryListAdapter(CategoryActivity.this,
CategoryList);
return null;
}
function to call webservice :
public JSONArray getCategory(String URL){
try {
HttpPost request = new HttpPost(URL);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
// Send request to WCF service
DefaultHttpClient httpClient1 = new DefaultHttpClient();
HttpResponse response = httpClient1.execute(request);
Log.v("response code", response.getStatusLine().getStatusCode()
+ "");
responseCode = response.getStatusLine().getStatusCode();
// if(responseCode > 200){ // HERE I WS TRYING TO BREAK THE CODE AND TRYING TO RETURN NULL BT UNABLE TO DO SO
// CategoryArray = new JSONArray();
// CategoryArray.put(false);
// return null;
// }else{
HttpEntity responseEntity = response.getEntity();
// Read response data into buffer
char[] buffer = new char[(int) responseEntity.getContentLength()];
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);
reader.read(buffer);
stream.close();
CategoryArray = new JSONArray(new String(buffer));
Log.v("results length : ", CategoryArray.length() + "");
// }
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return CategoryArray;
}
see the line where i am comparing response code.Please guide me on how can i break my code there and show u a toast on ui
Solução
After seeing the logcat you have posted, I feel you are fetching a JSON String as a response. When you get the response you want you will need to parse it.
So, in order that you are not held up afterwards in your code, I am helping you to continue after you get your response by giving following example of mine:
In one of my projects the response I got from the web service was:
{"checkrecord":[{"rollno":"abc2","percentage":40,"attended":12,"missed":34}],"Table1":[]}
In order to parse I did the following:
JSONObject jsonobject = new JSONObject(result);
JSONArray array = jsonobject.getJSONArray("checkrecord");
int max = array.length();
for (int j = 0; j < max; j++)
{
JSONObject obj = array.getJSONObject(j);
JSONArray names = obj.names();
for (int k = 0; k < names.length(); k++)
{
String name = names.getString(k);
String value= obj.getString(name);
}
My JSONObject looks like this:
{"Table1":[],"checkrecord":[{"missed":34,"attended":12,"percentage":40,"rollno":"abc2"}]}
This is what the @gwa was trying to suggest. I just gave a code sample to you. Get your result first and determine whether it is valid.
Hope it helps
Cheers
Outras dicas
At the same time you should check the Response code, by using this code you can easily find out whether the request has made successful or failed due to server down or any other reason.
You can check the response status code by using:
response.getStatusLine().getStatusCode();
The problem is that you are creating a JSON object using a response which is empty or does not represent a json string.
So, you should create a JSON object based on your response if:
- the status code is 200
- the response is not empty
- the response starts with '['