Android: как работает метод execute () в AsyncTask? - PullRequest
0 голосов
/ 20 октября 2019

Итак, я сейчас изучаю AsyncTask в Android, и есть следующий простой пример:

public class MainActivity extends AppCompatActivity {

    public class DownloadTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {

            URL url;
            HttpURLConnection urlConnection = null;

            try {
                url = new URL(urls[0]);
            ...
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DownloadTask task = new DownloadTask();
        String result = null;
        try {
            result = task.execute("http://someURL").get();
        } catch (Exception e) {
            e.printStackTrace();
        }

        Log.i("Result",result);
    }
}

Единственное, что я не понимаю в этом примере, это:

В разделе try есть строка, передаваемая методу execute. Метод execute является частью объекта task. Метод doInBackground также является частью объекта task. Как метод doInBackground узнает о содержимом, которое я передаю методу execute? Потому что в учебнике я узнал, что url = new URL(urls[0]); содержит информацию о строке, которая передается через метод execute. Может кто-нибудь объяснить мне эту связь?

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Класс DownloadTask является прямым дочерним классом AsyncTask. AsyncTask и предоставляет реализацию для асинхронного управления задачей, и вам не нужно беспокоиться о деталях пула потоков или любых других деталях. AsyncTask класс использует шаблоны Java, то есть шаблон с тремя параметрами. Вы используете String в качестве первого и третьего параметра шаблона, поэтому doInBackground примет номер варианта String объектов и вернет объект String. «Связь» между методом execute и doInBackground находится внутри класса AsyncTask и скрыта в родительском классе, это инкапсуляция и скрытие информации, обычно выполняемые в объектно-ориентированном дизайне.

public class DownloadTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {

            URL url;
            HttpURLConnection urlConnection = null;

            try {
                url = new URL(urls[0]);
            ...
        }
    }
0 голосов
/ 20 октября 2019

Вот лишь краткий обзор того, как это работает. Я плохо имитировал его работу, но, надеюсь, вы получите представление.

fun main() {
  object : AsyncTask() {
     override fun doInBackground() {
         println("I am now in the background thread ^_^")
      }
  }.execute()
}



abstract class AsyncTask() {

  abstract fun doInBackground()

  fun execute() {
      Thread(Runnable { doInBackground() }).apply {  //Don't ever use a thread like this. It's just an example!
          name = "Background thread"
      }.start()
   }
}

Посмотрите, как я предоставил свой код, который должен работать в фоновом потоке, в переопределенном методе doInBackground().

...