Загрузка ресурса Android в WebView

У меня есть приложение для Android, которое отображает комикс. Чтобы использовать встроенные элементы управления масштабированием, я загружаю изображения в WebView следующим образом:

webView.loadUrl("file:///android_asset/page1.jpg");

Это работает нормально, однако, поскольку изображения находятся в папке ресурсов, они не сжимается, что делает мой .apk огромным. Мне было интересно, как ссылаться на файлы ресурсов (из папки res / drawable ) с помощью пути к файлу, как я сделал выше с активами. Кто-нибудь знает, как будет выглядеть этот путь? Я пробовал такие вещи, как "file: ///res/drawable/pagetitle.jpg" , но безуспешно. Спасибо за помощь.


Обновление:

Я обнаружил, что "файл: /// android_res / drawable / page1. Я сделал его настолько маленьким, насколько это возможно, но при этом все еще сообщаю о проблеме.

Хорошо, это сводит меня с ума. У меня есть клиентская и серверная программа, обе на C #. Сервер отправляет данные клиенту через Socket.Send (). Клиент получает данные через Socket.BeginReceive и Socket.Receive. Мой псевдопротокол выглядит следующим образом: сервер отправляет двухбайтовое (короткое) значение, указывающее длину фактических данных, за которыми сразу же следуют фактические данные. Клиент асинхронно читает первые два байта, преобразует байты в короткие и сразу же синхронно считывает это количество байтов из сокета.

Теперь это нормально работает для одного цикла каждые несколько секунд или около того, но когда я увеличиваю скорость, все становится странно. Кажется, что клиент будет случайным образом читать фактические данные при попытке чтения из двухбайтовой длины. Затем он пытается преобразовать эти произвольные два байта в короткий, что приводит к совершенно неверному значению, вызывая сбой. Следующий код взят из моей программы, но обрезан, чтобы отображать только важные строки.

Серверный метод для отправки данных:

private static object myLock = new object();
private static bool sendData(Socket sock, String prefix, byte[] data)
{
    lock(myLock){
        try
        {
            // prefix is always a 4-bytes string
            // encoder is an ASCIIEncoding object    
            byte[] prefixBytes = encoder.GetBytes(prefix);
            short length = (short)(prefixBytes.Length + data.Length);

            sock.Send(BitConverter.GetBytes(length));
            sock.Send(prefixBytes);
            sock.Send(data);

            return true;
        } 
        catch(Exception e){/*blah blah blah*/}
    }
}

Клиентский метод для получения данных:

private static object myLock = new object();
private void receiveData(IAsyncResult result)
{
    lock(myLock){
        byte[] buffer = new byte[1024];
        Socket sock = result.AsyncState as Socket;
        try
        {
            sock.EndReceive(result);
            short n = BitConverter.ToInt16(smallBuffer, 0);
            // smallBuffer is a 2-byte array

            // Receive n bytes
            sock.Receive(buffer, n, SocketFlags.None);

            // Determine the prefix.  encoder is an ASCIIEncoding object
            String prefix = encoder.GetString(buffer, 0, 4);

            // Code to process the data goes here

            sock.BeginReceive(smallBuffer, 0, 2, SocketFlags.None, receiveData, sock);
        }
        catch(Exception e){/*blah blah blah*/}
    }
}

Серверный код для надежного воссоздания проблемы :

byte[] b = new byte[1020];  // arbitrary length

for (int i = 0; i < b.Length; i++)
    b[i] = 7;  // arbitrary value of 7

while (true)
{
    sendData(socket, "PRFX", b);
    // socket is a Socket connected to a client running the same code as above
    // "PRFX" is an arbitrary 4-character string that will be sent
}

Глядя на приведенный выше код, можно определить, что сервер всегда будет отправлять число 1024, длину всех данных, включая префикс, в виде короткого (0x400), за которым следует «PRFX» в двоичном формате ASCII, за которым следует связка семерок (0x07). Клиент всегда будет читать первые два байта (0x400), интерпретировать их как 1024, сохранять это значение как n, а затем читать 1024 байта из потока.

Это действительно то, что он делает в течение первых 40 или около того итераций, но спонтанно клиент прочитает первые два байта и интерпретирует их как 1799, а не 1024! 1799 в шестнадцатеричном формате - это 0x0707, что является двумя последовательными семерками !!! Это данные, а не длина! Что случилось с этими двумя байтами? Это происходит с любым значением, которое я помещаю в массив байтов, я просто выбрал 7, потому что легко увидеть корреляцию с 1799.

Если вы все еще читаете к этому моменту, я приветствую вашу преданность.

Некоторые важные наблюдения :

  • Уменьшение длины b увеличит количество итераций до возникновения проблемы, но не предотвратит возникновение проблемы
  • Добавление значительной задержки между каждой итерацией цикла может предотвратить возникновение проблемы
  • Это НЕ происходит при использовании и клиента, и сервера на одном хосте и подключения через адрес обратной связи.

Как упоминалось, Это сводит меня с ума! Я всегда могу решить свои проблемы с программированием, но эта меня полностью поставила в тупик. Так что я прошу здесь совета или знаний по этому вопросу.

Спасибо.

7
задан Nathan Daniels 31 January 2011 в 19:37
поделиться