Нужно ли нам ловить возвращаемое значение AsyncTask? - PullRequest
1 голос
/ 16 апреля 2020

Я написал задачу Asyn c ниже

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

        @Override
        protected String doInBackground(String... urls) {
            String result = "";
            HttpsURLConnection urlConnection = null;
            try {
                URL url = new URL(urls[0]);
                urlConnection = (HttpsURLConnection)url.openConnection();
                InputStream inputStream = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(inputStream);
                int data = reader.read();
                while (data != -1){
                    char currentData = (char)data;
                    result+=currentData;
                    data = reader.read();
                }
                Log.i("Downloaded data",result);
            }catch (Exception e){
                e.printStackTrace();
            }

            return result;
        }
    }

Здесь AsyncTask возвращает значение string. В методе onCreate я назвал объект этого AsyncTask

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView);
        titles = new ArrayList<String>();
        arrayAdapter =new ArrayAdapter(MainActivity.this,android.R.layout.simple_list_item_1,titles);
        listView.setAdapter(arrayAdapter);
        //To get json data
        DownloadTask task  = new DownloadTask();
        try {
            task.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");
        }catch (Exception e){
            e.printStackTrace();
        }

    }

Этот код работает без ошибок. Но я сомневаюсь, что нам не нужна переменная типа string для перехвата возвращаемого значения AsyncTask. Здесь переменная не используется, и она просто записывается как task.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");. Почему это не вызывает ошибку. Кто-нибудь может объяснить, пожалуйста. Я новичок в Android.

1 Ответ

2 голосов
/ 16 апреля 2020

Возвращаемое значение AsyncTask.execute(Params... params) - это сама задача, указанная в документации , так что вы можете сохранить ссылку на нее. Если вы просто игнорируете возвращаемое значение, это не приведет к ошибке.

AsyncTask работает асинхронно. Вот почему вы получите результат позже в методе onPostExecute(Result result) из AsyncTask. Этот метод запускается в потоке пользовательского интерфейса, поэтому вы можете обновить представления, например c. есть.

...