2017-07-11 8 views
-2

私はAndroid用ゲームに取り組んでいます。その一部はカスタムコードチャットシステム(IRCではない)です。他のネットワーク要求を遅延させずに一定のネットワーク接続を使用できますか?

チャットシステムは、HttpURLConnectionメソッドに対してAndroid AsyncTaskを使用し、自分のサーバー上のPHPファイルにPOSTリクエストを行います。このリクエストは1秒に1回生成され、チャット専用の場合は正常に動作します。

同じロジックがゲーム内の他のネットワークリクエスト(基本的なアクティビティの実行など)に適用され、正常に動作します。しかし、私たちの開発チームは、ゲーム内のチャットを横引き引き出しに移動することを決めました。

ゲームが開いている間、チャットが常に実行されているため、他のすべてのネットワークリクエストは非常に遅く実行されています。チャットはメインスレッドから実行されていないため、これを処理する別のスレッドを作成しました。スレッドがループするたびに、AsyncTaskのスレッド固有のインスタンスが使用されますが、依然として要求が遅くなっています。

これらの遅延の原因となることが間違っていることがありますか、またはチャットリクエストが1秒に1回呼び出されていると考えると、これらのリクエストを行う良い方法がありますか?関連コードについては下記をご覧ください。 (Global.getMessages()から呼び出さ)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方法

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; 
    } 
} 

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 
    } 
} 

構造チャット呼び出すために使用

スレッド

実行フロー:

  1. チャットスレッドが起動し、IsUpdatingがfalseになるまで、毎秒を実行します。
  2. チャットスレッドは、AsyncTaskのインスタンスを作成し、非同期要求で要求を実行します。
  3. AsyncTaskは、HttpURLConnectionを使用してサーバーに要求します。
+0

クイック返信ありがとうございます。私の無知を許してください。しかし、この状況ではServerSocketはどのように役立ちますか?複数のネットワークスレッドをサポートしていますか?私のサーバはほとんど何かをサポートしていますが、私はそれが私の最も強いサーバー側言語であり、PHPを使用して多くのカスタム機能を構築できるので、PHPを使用する方が好きです。 –

+0

インターネットの速度によって速く動作しますが、複数のスレッドを使用できます。 PHPを削除する必要はありませんが、このサーバー/クライアントはアドオンですが、PHPとJavaの両方をサポートするサーバーが必要です。あなたのPHPはそれが何をしている間チャットサーバーとして役立つためにあなたのサーバーで実行されているJavaプログラムを持っている必要があります。 – Enzokie

答えて

-1

私は解決策がローカルJavaではなく、PHPコードであることが判明しました。毎秒多くの情報(〜25000文字)を処理しようとしていました。私はPHPコードを再構築し、約250msでリクエストを実行します。これはチャット・ラインあたり約1msです。

関連する問題