我有一个关于异步任务的基本问题。
我是Android编程的初学者,很抱歉这个问题。
我要在doinbackground中打开一个套接字。
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的引用?
编辑2:
这是对主线程的引用吗?
该代码示例中的垃圾收集器是否不会删除这些对象?
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;
并且不要忘记在执行异步任务之前先进行设置
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)
希望我的回答可以对您有所帮助:)