2013-08-04 54 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