私は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
}
}
構造チャット呼び出すために使用
スレッド
実行フロー:
- チャットスレッドが起動し、
IsUpdating
がfalseになるまで、毎秒を実行します。 - チャットスレッドは、AsyncTaskのインスタンスを作成し、非同期要求で要求を実行します。
- AsyncTaskは、
HttpURLConnection
を使用してサーバーに要求します。
クイック返信ありがとうございます。私の無知を許してください。しかし、この状況ではServerSocketはどのように役立ちますか?複数のネットワークスレッドをサポートしていますか?私のサーバはほとんど何かをサポートしていますが、私はそれが私の最も強いサーバー側言語であり、PHPを使用して多くのカスタム機能を構築できるので、PHPを使用する方が好きです。 –
インターネットの速度によって速く動作しますが、複数のスレッドを使用できます。 PHPを削除する必要はありませんが、このサーバー/クライアントはアドオンですが、PHPとJavaの両方をサポートするサーバーが必要です。あなたのPHPはそれが何をしている間チャットサーバーとして役立つためにあなたのサーバーで実行されているJavaプログラムを持っている必要があります。 – Enzokie