2016-04-16 87 views
0

我在做套接字編程。無論何時用戶觸摸屏幕,觸摸位置都會發送到我的服務器。但有時,從我的客戶端Android應用程序發送到我的服務器的數據有5秒的延遲。我的問題是,有任何可能性,因爲當用戶觸摸屏幕時正在執行大量的AsyncTasks ,所以可能是由於這個延遲?如果情況並非如此,我還會附加服務器端代碼。這裏是我的客戶端代碼:Android Socket編程:用於發送實時數據的AsyncTask

編輯:更新代碼

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    long curTime = System.currentTimeMillis(); 

    if ((curTime - lastUpdate) > 50) { 
     lastUpdate = curTime; 

     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     String msg = x + " " + y + " " + "<EOF>"; 
     new Client().execute(msg); 
    } 

    return false; 
} 

private class Client extends AsyncTask<String, Void, String> { 
    protected String doInBackground(String... messages) { 
     Socket socket; 
     try { 
      socket = new Socket(ip, 1755); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      out.println(messages[0]); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return ""; 
    } 
} 

現在,我送觸摸位置每隔50毫秒之後。但其對服務器端的影響是滯後的。如果我將間隔設置爲小於50,比如20,那麼同樣的問題仍然存在。也就是說,有5秒的延遲。任何解決方案另外,我想這個間隔必須根據每個設備來設置?

+0

爲什麼你總是關閉套接字? – Krish

+0

我剛剛找到一個例子,並遵循它。我是套接字編程的初學者。 –

回答

1

你這樣做是錯誤的。首先,如果你在HONEYCOMB上運行,有「敏感」的用戶,你將最終得到大量的並行運行的AsyncTasks 試圖在同一時間達到你的終點,保持開放的套接字,消耗資源。也不能保證您將以您的任務開始的相同順序接收數據(更不用說錯誤處理)。另一方面,如果您在HONEYCOMB上運行,那麼最終會有大量排隊的AsyncTasks等待執行。兩種方法都不行,你應該緩存數據(將你的觸摸存儲在設備本地數據庫中),然後不時運行網絡代碼(例如,一旦數據或DB中的記錄達到閾值或X分鐘通過)並在一個更大的請求中發送來自數據庫的所有數據。

編輯

在我的服務器應用程序,我想將我的對象作爲用戶在客戶端應用程序移動他的手指

你需要重新思考的方法,然後,利用「事件「如果可能的話,否則你的服務器應用程序會相當遲鈍。所以我寧願儘量避免在拖動過程中通過發送每個X,Y來實現「拖拽」,但是我只需創建「moveTo」事件併發送moveTo object Z to X,Y,以便我的服務器應用程序能夠更新對象的狀態。

EDIT 2

您將無法動畫對象的服務器應用程序拖動方式但這是唯一的缺點。是的,這是我的觀點。不幸的是,服務器應用程序的主要目標是動畫

然後,你很可能需要緩衝你的數據。另外單身聯網任務按順序發送事件。無論如何,您可能需要進行一些「過濾」來限制每個時間單位的座標數量(即避免快速移動,並在1秒內避免100對座標)。

+0

就我而言,我想對這些觸動進行實時反應。 –

+0

在我的服務器應用程序中,我想在用戶在客戶端應用程序中移動手指時移動對象,那麼是否還有其他替代方法,以便我可以更快地發送數據? –

+0

你能給我一個主意嗎?我不是要求代碼,只是一個方向。 –