Асинхронная задача Android и сокет TCP/IP

У меня есть основной вопрос об асинхронной задаче. Я новичок в программировании для 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 прошли.)

Сокет еще доступен? Или он будет удален сборщиком мусора?

Следующий вопрос, но на самом деле тот же фон.

Что происходит с экземпляром класса, который я создаю в doInBackground после завершения AsyncTask? (Как только 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;
    }

  }

}

Заранее спасибо.


person snipor    schedule 04.08.2013    source источник


Ответы (2)


Сокет еще доступен? Или он будет удален сборщиком мусора?

Нет, сокет будет недоступен и будет удален сборщиком мусора, поскольку он не содержит ссылок.

Что происходит с экземпляром класса, который я создаю в doInBackground после завершения AsyncTask? (Как только doInBackground и OnPostExecute прошли.)

так же, как и выше, ipconnection не содержит никаких ссылок, поэтому он будет собран сборщиком мусора.

если вы хотите передать его активности, вы можете создать интерфейс

public interface AsyncResultPasser {
    void passSocket(Socket socket);
    void passIPconnection(IPConnection ipcon);
}

а затем в вашем классе асинхронных задач вы должны добавить

public AsyncResultPasser delegate = null;

и не забудьте установить его перед выполнением асинхронной задачи.

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)

Надеюсь, мой ответ поможет вам :)

person Niko Adrianus Yuwono    schedule 04.08.2013
comment
Спасибо за Ваш ответ. Какой самый простой способ создать ссылку из объекта (например, IPConnection ipcon = new IPConnection();) в AsyncTask на MainActivity? Мне действительно нужен интерфейс? - person snipor; 05.08.2013
comment
@snipor это зависит от того, где вы создаете свой класс асинхронной задачи, если вы создаете его в классе основной активности, вам не нужно создавать интерфейс, просто сделайте IPConnection членом класса MainActivity, после чего вы сможете получить к нему обычный/статический доступ. Но если класс asynctask находится в другом классе с классом MainActivity (классом, где вы хотите его использовать), вы должны создать интерфейс. Надеюсь, вы поняли мое объяснение :) - person Niko Adrianus Yuwono; 06.08.2013
comment
Спасибо за Ваш ответ. Я прикрепил пример короткого кода выше. Это отсылка к основной теме? - person snipor; 06.08.2013
comment
да, вы можете сделать это так или статически, но теперь с вашим кодом, если ваша активность завершилась, ваш сокет и ipconnection, возможно, будут собраны сборщиком мусора - person Niko Adrianus Yuwono; 07.08.2013

Как только doInBackground() завершится, все локальные экземпляры будут доступны для сборки мусора, если только вы не передадите один из них onPostExecute(), вернув его из doInBackground(). Такие экземпляры будут доступны после завершения onPostExecute(). Но опять же только в том случае, если вы не отправите эти экземпляры дальше куда-то.

person M-WaJeEh    schedule 04.08.2013