Обработка ответа сервера в Android - PullRequest
0 голосов
/ 05 декабря 2011

В моем приложении я получаю данные с помощью веб-сервисов. Но когда сервер выключен или не находится в активном состоянии, он выдает код ответа 500 и приложение закрывается.

Пожалуйста, объясните мне, как справиться с этим условием в моем приложении. Вывод logcat показан ниже:

<code>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:             &lt;error statusCode=&quot;404&quot; redirect=&quot;filenotfound.htm&quot; /&gt;

12-05 12:17:22.377: W/System.err(950): Line 31:         &lt;/customErrors&gt;

12-05 12:17:22.377: W/System.err(950): <font color=red>Line 32:         &lt;compilation debug=&quot;true&quot; targetFramework=&quot;4.0&quot;&gt;

12-05 12:17:22.396: W/System.err(950): </font>Line 33:          &lt;expressionBuilders&gt;

12-05 12:17:22.396: W/System.err(950): Line 34:                 &lt;add expressionPrefix=&quot;NopResources&quot; type=&quot;NopSolutions.NopCommerce.BusinessLogic.Localization.NopResourceExpressionBuilder, Nop.BusinessLogic&quot; /&gt;
12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22,396: W / System.err (950):
12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): Исходный файл: C: \ Websites \ balajeebazaar \ web.config & nbsp; & nbsp; Строка: 32 12-05 12: 17: 22,396: W / System.err (950):

12-05 12: 17: 22.396: W / System.err (950): 12-05 12: 17: 22.396: W / System.err (950): <ширина часа = размер 100% = 1 цвет = серебро> 12-05 12: 17: 22.407: W / System.err (950): 12-05 12: 17: 22.407: W / System.err (950): Информация о версии: Microsoft .NET Framework Версия: 2.0.50727.4963; ASP.NET версия: 2.0.50727.4955 12-05 12: 17: 22.407: W / System.err (950): 12-05 12: 17: 22.407: W / System.err (950): 12-05 12: 17: 22.407: W / System.err (950): 12-05 12: 17: 22.416: W / System.err (950): 12-05 12: 17: 22.416: W / System.err (950): 12-05 12: 17: 22.416: W / System.err (950): <! - 12-05 12: 17: 22.416: W / System.err (950): [ConfigurationErrorsException]: нераспознанный атрибут 'targetFramework'. Обратите внимание, что имена атрибутов чувствительны к регистру. (C: \ Websites \ balajeebazaar \ web.config строка 32) 12-05 12: 17: 22.416: W / System.err (950): по адресу System.Web.HttpRuntime.HostingInit (HostingEnvironmentFlags hostingFlags) 12-05 12: 17: 22.416: W / System.err (950): [HttpException]: нераспознанный атрибут targetFramework. Обратите внимание, что имена атрибутов чувствительны к регистру. (C: \ Websites \ balajeebazaar \ web.config строка 32) 12-05 12: 17: 22.416: W / System.err (950): в System.Web.HttpRuntime.FirstRequestInit (контекст HttpContext) 12-05 12: 17: 22.416: W / System.err (950): at System.Web.HttpRuntime.EnsureFirstRequestInit (контекст HttpContext) 12-05 12: 17: 22.416: W / System.err (950): в System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, контекст HttpContext) 12-05 12: 17: 22.416: W / System.err (950): -> <! - 12-05 12: 17: 22.426: W / System.err (950): эта страница ошибки может содержать конфиденциальную информацию, поскольку ASP.NET настроен для отображения подробных сообщений об ошибках с помощью & lt; customErrors mode = "Off" / & gt ;. Попробуйте использовать & lt; customErrors mode = "On" / & gt; или & lt; customErrors mode = "RemoteOnly" / & gt; в производственных условиях .--> 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): в org.json.JSONArray. (JSONArray.java:104) 12-05 12: 17: 22.426: W / System.err (950): at org.json.JSONArray. (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): на 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): на java.util.concurrent.FutureTask.run (FutureTask.java:122) 12-05 12: 17: 22.436: W / System.err (950): по адресу java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:648) 12-05 12: 17: 22.436: W / System.err (950): на 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: поток завершается с необработанным исключением (группа = 0x4001aa28) 12-05 12: 17: 22.446: E / AndroidRuntime (950): необработанный обработчик: поток AsyncTask # 1 завершает работу из-за необработанного исключения 12-05 12: 17: 22.446: E / AndroidRuntime (950): java.lang.RuntimeException: произошла ошибка при выполнении doInBackground () 12-05 12: 17: 22.446: E / AndroidRuntime (950): на android.os.AsyncTask $ 3.done (AsyncTask.java:200) 12-05 12: 17: 22.446: E / AndroidRuntime (950): на java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:234) 12-05 12: 17: 22.446: E / AndroidRuntime (950): в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:258) 12-05 12: 17: 22.446: E / AndroidRuntime (950): по адресу java.util.concurrent.FutureTask.run (FutureTask.java:122) 12-05 12: 17: 22.446: E / AndroidRuntime (950): по адресу java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:648) 12-05 12: 17: 22.446: E / AndroidRuntime (950): по адресу java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:673) 12-05 12: 17: 22.446: E / AndroidRuntime (950): на java.lang.Thread.run (Thread.java:1060) 12-05 12: 17: 22.446: E / AndroidRuntime (950): вызвано: 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): на 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

СМ. СЛЕДУЮЩИЙ КОД:

сегмент кода, где вызывается функция для вызова веб-службы:

@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;
        }

функция для вызова веб-службы:

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;
}

см. Строку, где я сравниваю код ответа. Пожалуйста, объясните мне, как я могу разбить мой код там и покажу тост за пользовательский интерфейс

Ответы [ 3 ]

3 голосов
/ 05 декабря 2011

Проблема в том, что вы создаете объект JSON, используя ответ, который является пустым или не представляет строку json.

Итак, вы должны создать JSON-объект на основе вашего ответа, если:

- the status code is 200
- the response is not empty
- the response starts with '['
3 голосов
/ 05 декабря 2011

В то же время вы должны проверить код ответа, используя этот код, вы можете легко узнать, был ли запрос успешным или неудачным из-за сбоя сервера или по любой другой причине.

Вы можете проверить код статуса ответа, используя:

response.getStatusLine().getStatusCode();
1 голос
/ 05 декабря 2011

После просмотра logcat, который вы разместили, я чувствую, что вы получаете строку JSON в качестве ответа. Когда вы получите нужный ответ, вам нужно будет его проанализировать.

Итак, чтобы впоследствии вас не задерживали в коде, я помогаю вам продолжить после того, как вы получите свой ответ, приведя мой следующий пример:

В одном из моих проектов ответ от веб-службы был:

{ "checkrecord": [{ "rollno": "abc2", "процент": 40, "участие": 12, "пропустили": 34}], "Таблица1": []}

Для разбора я сделал следующее:

      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);  

   }

Мой JSONObject выглядит так:

{ "Таблица1": [], "checkrecord": [{ "пропустил": 34, "участие": 12, "процент": 40, "rollno": "abc2"}]}

Это то, что @gwa пытался предложить. Я просто дал вам пример кода. Сначала получите свой результат и определите, является ли он действительным.

Надеюсь, это поможет

Приветствия

...