2013-08-04 29 views
0

我有一个关于异步任务的基本问题。 我是Android编程的初学者,对于这个问题感到抱歉。Android异步任务和TCP/IP套接字

我打算在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已经过去。)

------------------------------- --------------------------------------

编辑:

如何创建从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

只要doInBackground()完成后,所有本地实例将可用于垃圾收集,除非你通过返回它形成doInBackground()传递这些之一onPostExecute()。此类实例将在onPostExecute()完成后提供。但是,只有当你不把这些实例发送到更远的地方。

2

套接字是否仍然可用?或者它会被垃圾清除 收藏家?

没有插座将无法使用,并会被垃圾收集器删除,因为它不持有任何参考

恰好一个类的实例,我实例化 doInBackground的AsyncTask后什么已完成? (只要 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)

我希望我的回答可以帮助你:)

+0

谢谢您的回答。将AsyncTask中的对象(例如IPConnection ipcon = new IPConnection();)创建为MainActivity的最简单方法是什么?我真的需要一个界面吗? – snipor

+0

@snipor它取决于你在哪里创建你的asynctask类,如果你在主活动类中创建它,你不需要创建一个接口,只需要让IPConnection成为MainActivity类的成员,那么你就可以正常/静态地访问它。但是,如果asynctask类与MainActivity类(您想使用它的类)处于不同的类中,则必须创建一个接口。我希望你能理解我的解释:) –

+0

谢谢你的回答。 我已经附上了上面的简短代码示例。这是对主线程的引用吗? – snipor