2012-10-19 63 views
10

tôi đang làm việc trên một ứng dụng Android mà đòi hỏi một kết nối TCP đến một máy chủ TCP (viết bằng Node.js)kết nối TCP Android thực hành tốt nhất

My Android TCP client đang làm việc một có thể gửi tin nhắn qua lại.

câu hỏi spesific của tôi là:

  1. cách tốt nhất để xử lý một kết nối TCP đến một máy chủ trong Android là gì?
  2. Làm thế nào để duy trì kết nối (đóng kết nối đúng cách trên onDestroy() vv)?
  3. Có bether cách sau đó sử dụng một AsyncTask (Trừ một lớp Thread bình thường, mà không được phép trong Android 4,0)

tôi có kết nối ổ cắm của tôi trong một AsyncTask như thế này:

@Override 
protected Void doInBackground(Void... params) { 
     try { 
      Log.d("TCP_MESSAGE", "Connecting..."); 

       socket = new Socket(MY_LOCAL_IP, 8080); 
       dataOutput = new DataOutputStream(socket.getOutputStream()); 

       inputstream = new InputStreamReader(socket.getInputStream()); 
       input = new BufferedReader(inputstream); 


      while (!canceled) { 
       String message = input.readLine(); 
       handleMessage(message); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

Lý do tôi có kết nối trong AsyncTask là vì tôi đang sử dụng android 4.0 và không được phép có mã mạng trong một Chủ đề thông thường.

+2

Bạn có nói rằng sử dụng Thread không được phép trong 4.0? Điều đó không đúng. Nhưng dù sao nhìn thấy câu trả lời của tôi dưới đây. –

+0

Bạn đang sai về việc có chuỗi trong phiên bản 4.0. Những gì bạn không thể làm là có mã mạng trong chuỗi ** CHÍNH **. – m0skit0

+0

Okey. Tôi đã có một ngoại lệ khi tôi sử dụng một Thread bình thường (Và tìm thấy các chủ đề khác mà spesified cùng một vấn đề). Nhưng tôi đã nghĩ rằng đó là một chút lạ, tôi đoán bạn có quyền. – Emil

Trả lời

6

Dịch vụ phải sở hữu kết nối. Nếu bạn cần giữ kết nối trong khi ứng dụng của bạn không chạy, thì bạn nên làm cho nó trở thành một dịch vụ nền trước. Nếu bạn không làm cho nó trở thành một dịch vụ nền trước, hãy chắc chắn ràng buộc với dịch vụ từ các hoạt động của bạn để giữ nó sống động.

Đừng quên rằng dịch vụ cũng chạy trên luồng chính (UI), do đó bạn vẫn cần một chuỗi riêng biệt để xử lý việc liên lạc.

Nếu bạn chỉ có một hoạt động và chỉ muốn xử lý các lần khởi động lại do thay đổi cấu hình, bạn có thể tự xử lý các thay đổi cấu hình, giữ kết nối được sở hữu bởi một đoạn không phải là ui hoặc chuyển kết nối tới chính mình bằng cách sử dụng onRetainNonConfigurationInstance ()/getLastNonConfigurationInstance() (tuy nhiên, điều đó không còn được dùng để sử dụng các đoạn).

+0

Tôi không biết tại sao bạn đang nói về Dịch vụ. Anh ta không đề cập đến Dịch vụ ở bất cứ đâu, hoặc anh ấy nói về việc duy trì kết nối khi ứng dụng đã chết. Trong thực tế, ông nói rằng ông muốn kết nối bị phá hủy trong 'onDestroy()' gọi lại ... – m0skit0

+4

Không, nhưng ông hỏi về cách tốt nhất để giữ kết nối, và đó là một dịch vụ nếu bạn muốn giữ kết nối giữa các hoạt động và thay đổi cấu hình. –

+1

Cách tốt nhất để giữ kết nối ** trong tình huống đó ** – m0skit0

2

Cách tốt nhất để xử lý kết nối TCP với máy chủ trong Android là gì?

Điều này phụ thuộc rất nhiều vào độ phức tạp của ứng dụng và những gì bạn muốn làm. Không có chi tiết cụ thể cho mạng Android.

Cách duy trì kết nối (đóng kết nối đúng cách onDestroy() v.v ...)?

Mở ổ cắm bất cứ khi nào bạn rơi xuống và giữ nó như một trường lớp. Đóng nó khi onDestroy() được gọi. Hãy chắc chắn rằng bạn kiểm tra nếu nó không phải là null đầu tiên.

Có cách nào bether sau đó sử dụng một AsyncTask (Trừ một Thread lớp bình thường, mà không được phép trong Android 4,0)

Bạn có thể sử dụng chủ đề Java bình thường trong Android 4.0 (API14). Bạn có thể có sự nhầm lẫn: những gì không được phép trong Android là có mã mạng trong chuỗi chính (UIThread).

+0

Có, tôi đã sai về các chủ đề trong Android 4.0. Tôi đóng kết nối của tôi trên onDestroy(), nhưng đóng chủ đề tôi không allways dễ dàng. Nhưng cảm ơn bạn đã trả lời. – Emil

+1

Tại sao vậy? Chủ đề chỉ chết khi chúng thoát khỏi 'run()'. – m0skit0

+0

Giải thích cho downvote? – m0skit0

Các vấn đề liên quan