我在设置Socket连接时遇到了一些问题。
根据我的发现,构造函数Socket(InetAddress dstAddress, int dstPort)
不能在main
线程中使用。
这就是我的尝试:
在 CreateSocketTask.java
中public class CreateSocketTask extends AsyncTask<InetAddress,Void,Socket>{
<...>
@Override
protected Socket doInBackground(InetAddress... params) {
try
{
socket = new Socket(params[0], port);
return socket;
} catch(ConnectException e) {
Log.e("SocketClient", "Error", e);
return null;
} catch(IOException e) {
Log.e("SocketClient", "Error", e);
return null;
}
}
protected void onPostExecute() {
}
}
然后在我的 SocketClient.java :
中public class SocketClient implements Runnable{
<...>
public void run()
{
try
{
InetAddress serverAddress = InetAddress.getByName(serverIp);
new CreateSocketTask().execute(serverAddress);
try {
/*Here, I want to retrieve the result of my CreateSocketTask to use it in my new Thread, I tried CreateSocketTask.get() but without any success*/
new Thread(new SocketReader(new BufferedReader(new InputStreamReader(socket.getInputStream())), observerList)).start();
}
如何设置套接字连接?
这会有用吗?
我可以简单地创建一个新线程来执行我的Socket创建,而不是创建服务吗?像那样:
Thread SocketThread =new Thread(new Runnable() {
@Override
public void run() {
try {Socket socket = new Socket(serverAddress,port);}
catch (IOException e){}
}
});
SocketThread.run();
try {
new Thread(new SocketReader(new BufferedReader(new InputStreamReader(socket.getInputStream())), observerList)).start();
}
答案 0 :(得分:2)
不要使用AsyncTask,这个类的目的是根据“用于短操作(最多几秒)的文档”做很少的工作。“
因此,您最好实施服务来执行I / O请求http://developer.android.com/guide/components/services.html
答案 1 :(得分:1)
当您想使用套接字时,AsyncTask没用。当您需要在separeted线程中进行密集工作,然后在最后更改UI状态时,您应该使用AsyncTask。经典应用程序正在发出HTTP请求以从远程服务器检索某些数据,然后更新例如Adapter和UI组件。
您应该记住,如果您运行该服务并不意味着您在单独的线程中完成工作,那么无论如何都可以使用该服务进行后台工作。 文档说
服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。
因此,您必须启动一个单独的线程来处理服务器端并接受连接。每个连接都应该在一个单独的线程中处理,这样你就可以同时拥有多个连接。
相同的概念对客户端有效。
如果要更新UI,可以使用回调方法并更新主线程中的UI。
答案 2 :(得分:0)
问题解决了。
在公共类中,SocketClient实现了Runnable 我有方法public SocketClient(int port, String serverIp, Collection<Observer> observerList, Context context)
,我碰巧在其中创建了socket = new Socket(serverAddress, port)
。
要在我的 MapEngine.java 中完成这项工作,我只需添加
this.SocketClient = new SocketClient(-THEPORT-,-THEIPADDRESS-,null,this)
在我的构造函数中,然后通过调用
创建了我的套接字new Thread(SocketClient).start();