我有一个关于异步任务的基本问题。 我是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?
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;
}
}
}
提前谢谢。
答案 0 :(得分:2)
插座仍然可用吗?或者它会被垃圾删除 集电极?
没有套接字将不可用,垃圾收集器将删除它,因为它没有任何引用
我实例化的类的实例会发生什么 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)
我希望我的回答可以帮助你:)
答案 1 :(得分:0)
只要doInBackground()
完成,所有本地实例都可用于垃圾回收,除非您通过onPostExecute()
将其中一个实例传递给doInBackground()
。 onPostExecute()
完成后,此类实例将可用。但是,只有当你不在某个地方进一步发送这些实例时才会再次。