2010-12-04 3 views
-1

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

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

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

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

+0

Не знаю, как Java реализует потоки, но я предполагаю, что программа ожидает данных потока. Если это займет некоторое время или продолжает ждать, создайте отдельный поток для функции, которая будет запущена. Чтобы программа продолжала работать, а не ждать завершения getContents. Тем не менее, это я просто догадываюсь. – PeeHaa 2010-12-04 20:47:00

ответ

1

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

1

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

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

0

Попробуйте проверить код ответа, прежде чем пытаться прочитать тело ответа с сервера. Это либо подтвердит, что соединение выполнено успешно, либо распечатайте ответ об ошибке. Поместите следующий после вызова 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-ответ сервера или его отсутствие. Публикация комментария с вашими результатами была бы хорошей идеей.

Смежные вопросы