恒定的网络连接而不延迟其他网络请求?

时间:2017-07-11 00:04:50

标签: java android multithreading networking android-asynctask

我正在为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;
    }
}

执行流程:

  1. 聊天线程每秒启动并运行,直到IsUpdating为假。
  2. 聊天线程创建AsyncTask的实例并在异步请求上执行请求。
  3. AsyncTask使用HttpURLConnection向服务器发出请求。

1 个答案:

答案 0 :(得分:-1)

我发现解决方案不是使用本地Java,而是使用PHP代码。它试图每秒处理大量信息(约25000个字符)。我重新构建了php代码,它现在运行〜250ms的请求,每个聊天行大约1ms。

修改

嗯,自从我发布这个可怕的问题已经有一段时间了,但我决定更新这个,因为我最终使用了一种更平滑的方法来检索消息,并希望它会给别人一个关于如何优化他们的东西的想法。新系统的工作方式,它只会打开100条消息第一次打开聊天。它将消息的最新ID保存到变量,并在请求消息时将该ID发送到服务器。然后它只检索消息ID后发送的消息,然后在本地更新变量。它使事情变得更快。