Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 持续的网络连接而不延迟其他网络请求?_Java_Android_Multithreading_Networking_Android Asynctask - Fatal编程技术网

Java 持续的网络连接而不延迟其他网络请求?

Java 持续的网络连接而不延迟其他网络请求?,java,android,multithreading,networking,android-asynctask,Java,Android,Multithreading,Networking,Android Asynctask,我正在为Android开发一款游戏。它的一部分是一个自定义编码的聊天系统(不是IRC) 聊天系统使用Android AsyncTask对方法HttpURLConnection,向我的服务器上的PHP文件发出POST请求。此请求每秒生成一次,专用于聊天时可以正常工作 同样的逻辑也适用于游戏中的所有其他网络请求(例如执行基本活动),效果良好。然而,我们的开发团队决定将游戏中的聊天转移到一个侧面的抽屉中 既然游戏打开时聊天一直在运行,那么所有其他网络请求都运行得非常慢。聊天不是从主线程运行的,我创建了

我正在为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
    }
}
异步任务的结构

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
    为false
  • 聊天线程创建AsyncTask的实例,并根据异步请求执行请求
  • 异步任务使用
    HttpURLConnection
    向服务器发出请求

  • 我发现解决方案不是使用本地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;
        }
    }