У меня есть приложение для 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.
Если вы все еще читаете к этому моменту, я приветствую вашу преданность.
Некоторые важные наблюдения :
Как упоминалось, Это сводит меня с ума! Я всегда могу решить свои проблемы с программированием, но эта меня полностью поставила в тупик. Так что я прошу здесь совета или знаний по этому вопросу.
Спасибо.