[英]Android Async Task and TCP/IP Socket
我有一个关于异步任务的基本问题。 我是Android编程的初学者,对不起这个问题。
我打算在doinbackground打开一个socket。
doInBackground(... ) {
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket(192.168.0.1, 2000);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
}}
AsyncTask完成后套接字会发生什么? (只要doInBackground和OnPostExecute已通过。)
套接字仍然可用吗? 或者它会被垃圾收集器删除?
下一个问题,但实际上是相同的背景。
在AsyncTask完成后,我在doInBackground中实例化的类的实例会发生什么? (只要doInBackground和OnPostExecute已通过。)
doInBackground(... ) {
IPConnection ipcon = new IPConnection();
}
-------------------------------------------------- -------------------
编辑:
如何从Asynctask中的对象创建引用到MainActivity?
EDIT2:
这是对主线程的引用吗? 该代码示例中的垃圾收集器是否不会删除这些对象?
public class ClientActivity extends Activity {
private IPConnection ipcon;
private Socket Testsocket;
public class IPConnection extends AsyncTask<String, String, IPConnection> {
@Override
protected IPConnection doInBackground(String... message) {
ipcon = new IPConnection();
ipcon.run();
return null;
}
}
}
先感谢您。
套接字仍然可用吗? 或者它会被垃圾收集器删除?
没有套接字将不可用,垃圾收集器将删除它,因为它没有任何引用
在AsyncTask完成后,我在doInBackground中实例化的类的实例会发生什么? (只要doInBackground和OnPostExecute已通过。)
与上面相同,ipconnection没有任何引用,所以它将由垃圾收集器收集
如果要将其传递给活动,可以创建界面
public interface AsyncResultPasser {
void passSocket(Socket socket);
void passIPconnection(IPConnection ipcon);
}
然后在你的asynctask类中你必须添加
public AsyncResultPasser delegate = null;
并且在执行asynctask之前不要忘记先设置它
public class YourActivity implements AsyncResponse{
YourAsyncTask asyncTask = new YourAsyncTask ();
@Override
public void onCreate(Bundle savedInstanceState) {
asyncTask.delegate = this;
}
void passSocket(Socket socket){
//you can get your socket here
}
void passIPconnection(IPConnection ipcon){
//you can get your ipconnection here
}
}
并调用它只需使用delegate.passSocket(socket)
和delegate.passIPconnection(ipcon)
我希望我的回答可以帮助你:)
一旦doInBackground()
完成后,所有本地实例将可用于垃圾收集,除非你这些信息传递给一个onPostExecute()
通过返回它形成doInBackground()
在onPostExecute()
完成后,这些实例将可用。 但是,只有当你不在某个地方进一步发送这些实例时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.