我正在为Android开发游戏。部分内容是自定义编码的聊天系统(非IRC)。
聊天系统使用Android AsyncTask到方法HttpURLConnection
,向我服务器上的PHP文件发出POST请求。此请求每秒生成一次,并且在专用于聊天时工作正常。
相同的逻辑应用于游戏中的所有其他网络请求(例如执行基本活动)并且工作正常。但是,我们的开发团队决定将游戏中的聊天内容移到侧面拉出抽屉。
现在聊天在游戏开启时不断运行,所有其他网络请求运行速度非常慢。聊天没有从主线程运行,我创建了一个单独的线程来处理这个问题。每次线程循环时,它都使用AsyncTask的特定于线程的实例,但它仍然会导致请求变慢。
是否有任何导致这些延迟的错误,或者是否有更好的方式来发出这些请求(考虑到聊天请求每秒调用一次)?请参阅下面的相关代码。
用于呼叫聊天的主题
public class ChatThread extends Thread {
public static boolean IsUpdating = true;
public ChatThread() {
}
@Override
public void run() {
try {
while (IsUpdating) {
NetworkThread N = new MyAsyncTask();
final String Result = N.execute().get();
if (Result.contains("Error Connecting to Server")) {
System.out.println("Connection refused, waiting 3 seconds.");
Thread.sleep(3000);
}
Act.runOnUiThread(new Runnable() {
public void run() {
parseChat(Result);
}
});
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println("Error in chat thread: " + e);
}
}
public void parseChat(String Messages) {
// Parses messages and displays them
}
}
AsyncTask的结构
public class MyAsyncTask extends AsyncTask<String, Void, String> {
public MyAsyncTask() {
}
@Override
protected String doInBackground(String... params) {
return Global.getMessages("GameUsername", true);
}
protected void onPostExecute(String page) {
}
}
HttpURLConnection
方法(从Global.getMessages()
调用)
public static String Request(String UseURL, JSONObject JSON) {
try {
String data = "Data=" + URLEncoder.encode(JSON.toString(), "UTF-8");
URL postURL = new URL(API + UseURL);
HttpURLConnection conn = (HttpURLConnection) postURL.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(data);
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String retData = "";
while ((line = reader.readLine()) != null) {
retData += line;
}
writer.close();
reader.close();
return consoleBreaks(retData);
} catch (Exception e) {
return "Error Connecting to Server: " + e;
}
}
执行流程:
IsUpdating
为假。HttpURLConnection
向服务器发出请求。答案 0 :(得分:-1)
我发现解决方案不是使用本地Java,而是使用PHP代码。它试图每秒处理大量信息(约25000个字符)。我重新构建了php代码,它现在运行〜250ms的请求,每个聊天行大约1ms。
修改强>
嗯,自从我发布这个可怕的问题已经有一段时间了,但我决定更新这个,因为我最终使用了一种更平滑的方法来检索消息,并希望它会给别人一个关于如何优化他们的东西的想法。新系统的工作方式,它只会打开100条消息第一次打开聊天。它将消息的最新ID保存到变量,并在请求消息时将该ID发送到服务器。然后它只检索在消息ID后发送的消息,然后在本地更新变量。它使事情变得更快。