0

我有一个关于异步任务的基本问题。我是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 完成时,socket 会发生什么?(一旦 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;
    }

  }

}

先感谢您。

4

2 回答 2

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)

希望我的回答能帮到你:)

于 2013-08-04T11:00:20.903 回答
0

完成后doInBackground(),所有本地实例都将可用于垃圾收集,除非您通过将其中一个实例onPostExecute()返回给它 form doInBackground()。此类实例将在onPostExecute()完成后可用。但同样只有当您不将这些实例发送到更远的地方时。

于 2013-08-04T10:50:15.457 回答