Основной поток моего приложения непрерывно генерирует строковые данные, которые должны быть отправлены в рабочий поток 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
Он работает отлично на первый раз. Сбой происходит для второго сообщения.
как можно назначить '' String' к arg1', если это определяемый как 'int'? – user0815
@ user0815: Извините ... это была опечатка. См. Новый код. –
см. [This] (http://stackoverflow.com/questions/5864990/problem-in-handler-with-messages-in-android) вопрос ... похоже, что одно из решений может решить вашу проблему. – user0815