2016-06-23 2 views
-1

Основной поток моего приложения непрерывно генерирует строковые данные, которые должны быть отправлены в рабочий поток TCPCLient, для отправки по сокету.Получение исключения при отправке повторяющихся сообщений в рабочий поток TCPClient для трансляции

Это мой TCPClient:

public class TCPClient extends Thread 
{ 
    String ip; 
    int port; 
    PrintWriter out; 
    Handler handler; 

    TCPClient(String ip, int port) 
    { 
     this.ip = ip; 
     this.port = port; 
    } 

    public void run() 
    { 
     Looper.prepare(); 
     try 
     { 
      Socket socket = new Socket(ip,port); 

      BufferedReader in = new BufferedReader(
        new InputStreamReader(socket.getInputStream())); 
      out = new PrintWriter(socket.getOutputStream(), true); 

     }catch (Exception e) 
     { 
      Log.d("OKLINUX","Exception while creating socket"); 
      e.printStackTrace(); 
     } 
     handler = new Handler(){ 
      public void handleMessage(Message msg) 
      { 
       Log.d("OKLINUX","Data sent : "+msg.obj.toString()); 
       out.println(msg.obj.toString()); 
       out.flush(); 
      } 
     }; 
     Looper.loop(); 
    } 
} 

На моей главной теме:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sender = new TCPClient("192.168.0.7",2016); 
     sender.start(); 

     //some other code 

     //inside some sort of loop 
     { 
      Message msg = Message.obtain(); 
      msg.obj = "some string"; 
      sender.handler.sendMessage(msg); 
     } 
} 

StackTrace говорит IllegalStateException : This msg is already in use. Почему это так? Я полагаю, что Looper назначит новые сообщения из очереди, когда они будут доступны, и обработчик будет вызван для каждого отдельного сообщения.

Это StackTrace:

06-24 00:56:35.180: E/AndroidRuntime(16484): FATAL EXCEPTION: main 
06-24 00:56:35.180: E/AndroidRuntime(16484): Process: info.androidhive.speechtotext, PID: 16484 
06-24 00:56:35.180: E/AndroidRuntime(16484): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { (has extras) }} to activity {info.androidhive.speechtotext/info.androidhive.speechtotext.MainActivity}: java.lang.IllegalStateException: { when=-1ms what=108 obj=hello target=info.androidhive.speechtotext.TCPClient$1 } This message is already in use. 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread.deliverResults(ActivityThread.java:3659) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3702) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread.access$1300(ActivityThread.java:155) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1366) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Handler.dispatchMessage(Handler.java:102) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Looper.loop(Looper.java:135) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread.main(ActivityThread.java:5343) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at java.lang.reflect.Method.invoke(Native Method) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at java.lang.reflect.Method.invoke(Method.java:372) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
06-24 00:56:35.180: E/AndroidRuntime(16484): Caused by: java.lang.IllegalStateException: { when=-1ms what=108 obj=hello target=info.android.speechtotext.TCPClient$1 } This message is already in use. 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:320) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Handler.enqueueMessage(Handler.java:631) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Handler.sendMessageAtTime(Handler.java:600) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Handler.sendMessageDelayed(Handler.java:570) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.os.Handler.sendMessage(Handler.java:507) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at info.androidhive.speechtotext.MainActivity.onActivityResult(MainActivity.java:83) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.Activity.dispatchActivityResult(Activity.java:6218) 
06-24 00:56:35.180: E/AndroidRuntime(16484): at android.app.ActivityThread.deliverResults(ActivityThread.java:3655) 
06-24 00:56:35.180: E/AndroidRuntime(16484): ... 10 more 

EDIT

Он работает отлично на первый раз. Сбой происходит для второго сообщения.

+0

как можно назначить '' String' к arg1', если это определяемый как 'int'? – user0815

+0

@ user0815: Извините ... это была опечатка. См. Новый код. –

+0

см. [This] (http://stackoverflow.com/questions/5864990/problem-in-handler-with-messages-in-android) вопрос ... похоже, что одно из решений может решить вашу проблему. – user0815

ответ

0

Попробуйте использовать HandlerThread и инициализировать обработчик в onLooperPrepared(), из стека трассировки, похоже петлителем косяка отправленного сообщения, я думаю, потому что петлитель разве инициализируется

Смежные вопросы