繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM