Java 持续的网络连接而不延迟其他网络请求?
我正在为Android开发一款游戏。它的一部分是一个自定义编码的聊天系统(不是IRC) 聊天系统使用Android AsyncTask对方法Java 持续的网络连接而不延迟其他网络请求?,java,android,multithreading,networking,android-asynctask,Java,Android,Multithreading,Networking,Android Asynctask,我正在为Android开发一款游戏。它的一部分是一个自定义编码的聊天系统(不是IRC) 聊天系统使用Android AsyncTask对方法HttpURLConnection,向我的服务器上的PHP文件发出POST请求。此请求每秒生成一次,专用于聊天时可以正常工作 同样的逻辑也适用于游戏中的所有其他网络请求(例如执行基本活动),效果良好。然而,我们的开发团队决定将游戏中的聊天转移到一个侧面的抽屉中 既然游戏打开时聊天一直在运行,那么所有其他网络请求都运行得非常慢。聊天不是从主线程运行的,我创建了
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
}
}
异步任务的结构
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) {
}
}
执行流程:
isupdate
为falseHttpURLConnection
向服务器发出请求我发现解决方案不是使用本地Java,而是使用PHP代码。它试图每秒处理大量信息(约25000个字符)。我重新构造了php代码,现在它以大约250毫秒的速度运行请求,这大约是每条聊天线1毫秒 编辑:
好吧,我已经有一段时间没有发布这个糟糕的问题了,但我决定无论如何都要更新它,因为我最终使用了一种更平滑的方法来检索消息,希望它能让其他人知道如何优化他们的内容。按照新系统的工作方式,当你第一次打开聊天室时,它只会拉100条信息。它将消息的最新ID保存到变量中,并在请求消息时将该ID发送到服务器。然后,它只在消息ID之后检索已发送的消息,然后在本地更新变量。它使事情变得更快。谢谢您的快速回复。请原谅我的无知,但是ServerSocket在这种情况下会有什么帮助呢?它支持多个网络线程还是运行速度更快?我的服务器几乎支持任何东西,但我更喜欢使用PHP,因为它是我最强大的服务器端语言,我能够使用PHP构建许多自定义功能。它运行得更快取决于互联网速度,是的,你可以在上面使用多个线程。您不需要删除PHP,此服务器/客户端是一个附加组件,但您需要一个同时支持PHP和Java的服务器。您需要在服务器中运行一个Java程序来充当聊天服务器,而PHP则执行它的功能。
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;
}
}