try
{
Socket s =
new
Socket(
"192.168.1.5"
,
8240
);
InputStream inputStream = s.getInputStream();
DataInputStream input =
new
DataInputStream(inputStream);
byte
[] b =
new
byte
[
10000
];
while
(
true
)
{
int
length = input.read(b);
String Msg =
new
String(b,
0
, length,
"gb2312"
);
Log.v(
"data"
,Msg);
}
}
catch
(Exception ex)
{
ex.printStackTrace();
}
开线程执行接收操作
但是,如果接收代码直接放UI按钮处理事件中,将直接引发NetworkOnMainThreadException,这是因为不能在主线程中执行Socket操作。这里使用AsyncTask开另一个线程执行socket操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Activity按钮事件中
GetLogTask task =
new
GetLogTask();
task.execute(
null
);
// Activity类中嵌套类
public
class
GetLogTask
extends
AsyncTask<Void,Void,String>
{
@Override
protected
String doInBackground(Void...param){
try
{
Socket s =
new
Socket(
"192.168.1.5"
,
8240
);
InputStream inputStream = s.getInputStream();
DataInputStream input =
new
DataInputStream(inputStream);
byte
[] b =
new
byte
[
10000
];
while
(
true
)
{
int
length = input.read(b);
String Msg =
new
String(b,
0
, length,
"gb2312"
);
Log.v(
"data"
,Msg);
}
}
catch
(Exception ex)
{
ex.printStackTrace();
}
return
""
;
}
}
AsyncTask与界面线程通信
1、界面需要启动和暂停TCP接收操作。 界面线程使用AsyncTask.cancel()通知接收线程结束接收操作。 接收线程在doInBackground中调用isCancelled()来检查是否出现结束接收要求。
2、AsyncTask接收到数据之后,传递给界面显示。
接收线程使用Handler将数据传递给界面 使用Handler的话,数据作为“消息”传递给界面处理。 Handler包括了处理消息功能和发布消息功能。在这里,处理消息就是在界面上显示log文本,界面线程来干。发布消息就是将log文本作为参数,调用postmessage功能,接收线程来干。
主线程中的处理消息
1
2
3
4
5
6
Handler handler =
new
Handler(){
@Override
public
void
handleMessage(Message msg){
text.setText(text.getText().toString()+(String)msg.obj);
}
};
接收线程中的发布消息
1
2
3
Message msg =
new
Message();
msg.obj = msgstring;
(MainActivity.
this
).handler.postMessage();