【发布时间】:2012-05-03 03:06:48
【问题描述】:
我正在使用一个应用程序,它使用两个线程来读取数据并将数据发送到服务器。每个线程运行一个while循环;一个 que 包含一组命令,这些命令被 dequed 发送到服务器。这样我就可以将大量的命令排成队列并一一发送到服务器。
命令发送者是这样的
class writeThread extends AsyncTask<Object, Object, Object>
{
byte[] buffer;
LittleEndianDataOutputStream outputStream;
@Override
protected void onPreExecute()
{
}
@Override
protected Object doInBackground(Object... params)
{
try
{
buffer = new byte[4096];
outputStream = new LittleEndianDataOutputStream(dataHolder.connection.getOutputStream());
try
{
dataHolder.flags latestFlag;
while (true)
{
try
{
latestFlag = dataHolder.sendFlags.remove();
ByteBuffer sendBytes = ByteBuffer.allocate(128);
sendBytes.order(ByteOrder.LITTLE_ENDIAN);
switch (latestFlag)
{
case sendDataRequest:
sendBytes.putInt(20);
outputStream.write(sendBytes.array());
break;
case getSelectedData:
sendBytes.putInt(21);
sendBytes.put(dataHolder.latestSelected.getBytes());
outputStream.write(sendBytes.array());
break;
case disconnect:
sendBytes.putInt(254);
sendBytes.put(dataHolder.latestSelected.getBytes());
outputStream.write(sendBytes.array());
break;
}
}
catch (NoSuchElementException ex){}
}
}
catch (IOException ex) {}
}
catch (Exception ex){};
return null;
}
}
读取循环如下所示
while (inputStream.read() > -1)
因此,应用程序最终占用了手机 50% 的处理能力。有没有关于如何优化socket监听和数据发送的建议?
注意:是的,我知道我正在对队列使用 try catch 而不是 if 语句来检查队列是否为空。我确信抛出错误无助于优化,但我认为它不会将处理器推到 50%。如果您需要更多信息,请告诉我。
【问题讨论】:
-
大声笑我刚刚意识到我有一个未使用的 4kb 缓冲区。一定是以前的代码遗留下来的。
标签: android multithreading networking optimization