我想通过Java套接字在android和服务器(在我的PC中)之间建立一些连接。简单来说,它只是通过局域网发送诸如字符串和整数之类的数据。
我阅读了有关AsyncTask类的信息。我在类(名为doInBackground()
的类的RemoteClient
方法中添加了套接字连接代码。这是通过套接字连接和初始化连接的代码:
@Override
protected Void doInBackground(Void... arg0) {
Log.i("Socket","Connecting to the remote server: " + host);
try{
socket = new Socket(host,8025);
oos = new ObjectOutputStream(socket.getOutputStream());
}catch(IOException ex){
ex.printStackTrace();
}
return null;
}
我只是想通过套接字向服务器创建方法sendInteger(int value)
。我已经完成连接,连接良好。
那么,我应该将sendInteger(int value)
方法放在哪里,我可以将该方法与已实现的方法一起放在RemoteClient
类中吗?
我想在单击按钮时调用sendInteger(int value)
方法。
谢谢..
答案 0 :(得分:2)
是的,您只需将sendInteger放入AsyncTask中即可。我喜欢使用构造函数而不是AsyncTask参数,因为它更加灵活。您可以将接口实现为回调,以在UI中接收服务器答案。在执行onBackground之后,系统始终会调用onPostExecute。 onPostExecute也在UI线程上运行,因此您不必处理返回UI线程的问题,因为AsyncTask将在其他线程上运行。
您的代码如下:
Fragmentclass or Activity:
private void onButtonClick() {
...
RemoteClient rc = new RemoteClient(value, (response) -> {
Log.d(response);
};
rc.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...
}
public class RemoteClient extends AsyncTask<Void, Void, Void> {
private Callback callback;
private int intValue;
public RemoteClient(int intValue, Callback callback) {
this.callback = callback;
this.intValue = intValue;
}
@Override
protected Void doInBackground(Void... arg0) {
Log.i("Socket","Connecting to the remote server: " + host);
try{
socket = new Socket(host,8025);
oos = new ObjectOutputStream(socket.getOutputStream());
sendInteger(intvalue);
} catch(IOException ex){
ex.printStackTrace();
}
return null;
}
private void sendInteger(int value) {
// send the integer
}
protected void onPostExecute(Void aVoid) {
if (callback != null) {
callback.response;
}
}
private interface Callback {
void serverResponse(String value);
}
}
如果您想变得更加灵活,可以实现NetworkManager类,该类仅启动您的异步任务。然后,您始终可以将String作为JSON传递给AsyncTask。或者,您只使用AsyncTask,但随后我建议使用继承。