У меня возникла неудобная проблема (может быть, для меня). Я использую таймер для выполнения программирования Tcp listner и сокетов. Я открываю сокет для прослушивания любых данных, присутствующих на порту, отправленном с другого устройства Android (правильно работающего). Я создал 2 приложения для тестирования приема данных, один из них просто фиктивный, а второй - мое основное приложение. Я получаю исключение в своем основном приложении, но не в фиктивном приложении.Network on MainThread Exception (одно приложение работает, другое исключение для исключения)
Исключение: android.os.NetworkonMainThreadException
код точно так же в обоих приложениях здесь это
onCreate()
содержит
timer2 = new Timer();
timer2.schedule(new TimerTask() {
@Override
public void run() {
TimerMethod();
}
}, 0, 1000);
TimerMethod()
выглядит следующим образом
private void TimerMethod()
{
this.runOnUiThread(Timer_Tick);
}
Timer_Tick
является:
private Runnable Timer_Tick = new Runnable() {
public void run() {
try
{
runTcpServer();
}
catch(Exception a)
{
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(a.toString());
}
}
};
И главный метод Tcp слушать данные на порт
public void runTcpServer()
{
ServerSocket ss = null;
try {
ss = new ServerSocket(TCP_SERVER_PORT);
//ss.setSoTimeout(10000);
//accept connections
Socket s = ss.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//receive a message
String incomingMsg = in.readLine() + System.getProperty("line.separator");
TextView tv= (TextView) findViewById(R.id.textView2);
//Log.d("TcpServer", "received: " + incomingMsg);
tv.append(incomingMsg);
//send a message
String outgoingMsg = "goodbye from port " + TCP_SERVER_PORT + System.getProperty("line.separator");
out.write(outgoingMsg);
out.flush();
Log.d("TcpServer", "sent: " + outgoingMsg);
//textDisplay.append("sent: " + outgoingMsg);
//SystemClock.sleep(5000);
s.close();
} catch (InterruptedIOException e) {
//if timeout occurs
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
Log.d("Error",e.toString());
}
}
}
}
Исключение я получаю, когда я звоню runTcpServer()
в Timer_Tick
Почему он запущен в фиктивном приложении, созданном для тестирования? полученные данные верны. –
Что вы подразумеваете под созданием фиктивного приложения? – Raghunandan
Тестируемое приложение с такой же процедурой, как указано выше, работает правильно. –