Почему это приложение блокирует? - PullRequest
0 голосов
/ 04 декабря 2010

Я только что попробовал какой-то код из интернета и запустил его, но он заблокировал мой эмулятор. Код:

public void getcontents()
{
HttpConnection c = null;
InputStream is = null;
StringBuffer sb = new StringBuffer();
try
{
  c = (HttpConnection)Connector.open("http://www.java-samples.com",Connector.READ_WRITE, true);
  c.setRequestMethod(HttpConnection.GET); //default
  is = c.openInputStream(); // transition to connected!
  int ch = 0;
  for(int ccnt=0; ccnt < 150; ccnt++) { // get the title.
    ch = is.read();
    if (ch == -1){
      break;
    }
    sb.append((char)ch);
  }
}
catch (IOException x){
 x.printStackTrace();
}
finally{
     try{
       is.close();
          c.close();
     } catch (IOException x){
          x.printStackTrace();
     }
}
System.out.println(sb.toString());
}

Я вызвал функцию с помощью команды ОК.

Эмулятор блокировался, пока я не убил процесс. Как мне это решить?

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

Единственный цикл, который я вижу в вашем коде, это цикл for, который является конечным (не более 150 итераций), поэтому код не будет выполняться бесконечно.

Я бы предложил разместить несколько отладочных операторов вывода (вывод на консоль или даже предупреждения диалогового окна) в различных точках кода. Это поможет вам определить, какая строка кода вызывает проблему. Например, если вы помещаете строку до и после цикла for и при выполнении отображается только первая, вы знаете, что ваша проблема находится где-то внутри цикла. Затем вы можете сузить его, поместив строки отладки в цикл (включая номер цикла), чтобы выяснить, какая именно строка вызывает вашу проблему.

1 голос
/ 04 декабря 2010

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

0 голосов
/ 05 декабря 2010

Попробуйте проверить код ответа, прежде чем пытаться прочитать тело ответа с сервера.Это либо подтвердит успешное соединение, либо распечатает ответ об ошибке.Поместите следующее после вызова Connector.open():

         if (c.getResponseCode() != HttpConnection.HTTP_OK) {
             throw new IOException("HTTP response code: " + c.getResponseCode());
         } else {
             System.out.println("**Debug** : HTTP_OK received, connection established");
         }

Если при выполнении кода не выводится ни исключение, ни подтверждение HTTP, то вы, вероятно, блокируете попытку подключения (проверьте подключение вашего эмуляторав интернет).Если вы получите HTTP_OK, то, скорее всего, вы блокируете HTTP-ответ сервера или его нет.Публикация комментария с вашими результатами будет хорошей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...