2015-01-13 2 views
0

У меня есть клиентский класс, который пытается подключиться к серверу. Но, как вы знаете, вы не можете выполнять сетевые операции в основном потоке пользовательского интерфейса . Поэтому я должен создавать разные потоки для каждой операции.Java Android Sockets Threading

Текущий код:

package com.example.justus.rocchat; 
 

 
import android.os.AsyncTask; 
 
import android.util.JsonWriter; 
 

 
import java.io.BufferedWriter; 
 
import java.io.DataOutputStream; 
 
import java.io.IOException; 
 
import java.io.OutputStream; 
 
import java.io.OutputStreamWriter; 
 
import java.io.PrintWriter; 
 
import java.net.Socket; 
 
import java.net.URL; 
 
import java.net.UnknownHostException; 
 

 

 
/** 
 
* Created by justus on 13-1-2015. 
 
*/ 
 
public class Client 
 
{ 
 

 
    private String name; 
 
    private int port; 
 
    private String hostAddress; 
 
    private Socket socketClient; 
 
    private MainActivity mainActivity; 
 
    public boolean isConnected; 
 

 
    public Client(MainActivity mainActivity, String hostAdress, int port) 
 
    { 
 
     this.hostAddress = hostAdress; 
 
     this.port = port; 
 
     this.mainActivity = mainActivity; 
 

 
    } 
 

 

 

 
    public void send(final byte[] data) 
 
    { 
 

 

 
      Thread sendThread = new Thread(new Runnable() { 
 
      public void run() 
 
      { 
 
       try 
 
       { 
 
        DataOutputStream out = new DataOutputStream(socketClient.getOutputStream()); 
 
        out.write(data); 
 
        System.out.println("writed data"); 
 
       } catch (IOException ex) { 
 
       } 
 
      } 
 
      }); 
 

 

 
     sendThread.start(); 
 
    } 
 

 

 
    public void connect() 
 
    { 
 
     Thread connectThread = new Thread(new Runnable() { 
 
      public void run() { 
 
     try 
 
     { 
 
      System.out.println("trying to connect"); 
 
      socketClient = new Socket(hostAddress, port); 
 
      isConnected = true; 
 

 
     } 
 
     catch(UnknownHostException ex) 
 
     { 
 
      System.out.println("ex:" + ex.getMessage()); 
 
     } 
 
     catch (IOException ex) 
 
     { 
 
      System.out.println("ex:" + ex.getMessage()); 
 

 
     } 
 
      } 
 
     }); 
 

 
     connectThread.start(); 
 
    } 
 

 

 

 
}

Не является ли это немного больше? Есть ли более эффективные способы обработки этих операций? Уже спасибо за ваше время.

+0

, что заставляет вас думать, что это слишком много? – mangusta

+0

Создание потока для каждой операции? Разве это не использование большого количества потоков, а затем необходимых? –

+0

это зависит от того, как будет использоваться ваш метод 'send()'. вы не указали это. вы можете на самом деле получить один поток, если он соответствует тому, что вы хотите выполнить. обратите внимание, что основной задачей потоковой передачи является выполнение некоторой задачи независимо, то есть асинхронно – mangusta

ответ

0

Есть 2 варианта, которые вы имеете

  1. Используйте AsyncTask - гораздо проще, объектно-ориентированный, что использование потоков, но только для короткоживущих задач (до 30 секунд)
  2. Использование RoboSpice - https://github.com/stephanenicolas/robospice
    Из двух , Я предпочитаю RoboSpice
1

AsyncTask - это приемлемый способ обработки асинхронных операций. Это оболочка вокруг класса Thread и является частью Android SDK. Они должны использоваться только для операций, длившихся несколько секунд, для более длительных операций вы должны использовать Сервис.

developer.android.com/reference/android/os/AsyncTask.html