Скачивание файла с сервера - PullRequest
0 голосов
/ 22 марта 2012

Здесь я пытаюсь загрузить файл с сервера на SDCard.Код такой, как показано ниже:

try{
   FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml");
   if (fconn.exists()) {
      fconn.delete();
   }

   fconn.create();
   add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));

   HttpConnection connection = (HttpConnection)        
   Connector.open("http://127.0.0.1/xml/home.xml");
   add(new RichTextField("Connection success", Field.NON_FOCUSABLE));
   InputStream ds = connection.openInputStream(); 
   byte[] data = new byte[ds.available()];
   ds.read(data);
   add(new RichTextField("Data read", Field.NON_FOCUSABLE));
   OutputStream outStream = fconn.openOutputStream();
   outStream.write(data);
   outStream.close();
   add(new RichTextField("Data written succesfully", Field.NON_FOCUSABLE));
   fconn.close();

   }
   catch (Exception e) {
   // TODO: handle exception
}

Проблема в том, что на эмульаторе я вижу первые два сообщения, т.е.

  • Удалено и создано
  • Успешное соединение

Но после этого не сообщается, что данные записаны или нет.Размер файла XML составляет 1 КБ.Можете ли вы помочь мне над этим?Есть ли проблема в моем коде или есть другая проблема?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Прежде всего, эта строка:

add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));

Заставляет меня думать, что вы делаете это прямо в цепочке событий, что является плохой практикой. Если время соединения истекает или занимает много времени, то вы замораживаете графический интерфейс на это время. Обычно вы создаете рабочий поток для выполнения таких длинных задач.

Тем не менее, ваш код может работать, но он не очень надежен. Многое может пойти плохо. Например, эта строка:

HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");

Возвращенное соединение может быть пустым, поэтому вы должны проверить его. Вместо этого лучше использовать ConnectionFactory, так как он добавляет правильный суффикс для каждого типа соединения (WiFi, BES, TCP, ...). В симуляторе я не уверен, что вы можете использовать локальный URL-адрес, поскольку он является локальным для вашей рабочей станции, но моделируемое устройство BB должно пройти симулятор MDS.

С FileConnection вы также должны проверить, что оно не равно нулю, а также что fconn.canRead возвращает true. Имейте в виду, что не на каждом устройстве есть слот для SD-карт (в большинстве последних). Вы можете проверить, доступна ли карта, как описано в этой статье , или разрешить catch обработать исключение. Если вы тестируете на симуляторе, вам придется «смонтировать» виртуальную SD-карту.

Также этот звонок:

ds.read(data);

будет блокироваться до тех пор, пока сервер фактически не отправит вам что-то. Это, вероятно, то, что происходит.

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

ApplicationPermissions.PERMISSION_FILE_API 

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

ApplicationPermissions.PERMISSION_INTERNET
ApplicationPermissions.PERMISSION_SERVER_NETWORK

Последний совет: добавьте предложение finally к try-catch и закройте все потоки и соединения в finally (если они не равны нулю).

0 голосов
/ 26 марта 2012

HTTP-соединение предпринимается только в строке InputStream ds = connection.openInputStream();, которая не работает, поэтому после этого вы не видите никаких сообщений. Причина сбоя, вероятно, заключается в том, что симулятор не может получить доступ к указанному URL.

В строке Connector.open("http://127.0.0.1/xml/home.xml"); попробуйте изменить URL-адрес на http://127.0.0.1/xml/home.xml?interface=wifi.

Это заставит симулятор использовать симулированное соединение WLAN, которое фактически является сетевым интерфейсом вашего ПК. Убедитесь, что симулятор подключен к Default WLAN connection.

Кроме того, вместо добавления полей пользовательского интерфейса на экран, чтобы увидеть, что происходит в вашем коде, вам лучше добавить отладочное сообщение (например, System.out.println("Got connection")) и использовать отладчик - просто нажмите F11 из затмения .

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