Android异步任务和TCP / IP套接字

时间:2013-08-04 10:42:46

标签: java android tcp android-asynctask asyncsocket

我有一个关于异步任务的基本问题。 我是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;
    }

  }

}

提前谢谢。

2 个答案:

答案 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()完成后,此类实例将可用。但是,只有当你不在某个地方进一步发送这些实例时才会再次。