我们需要捕获 AsyncTask 的返回值吗?

Posted

技术标签:

【中文标题】我们需要捕获 AsyncTask 的返回值吗?【英文标题】:Do we need to catch the return value of AsyncTask? 【发布时间】:2020-07-29 21:16:25 【问题描述】:

我在下面写了一个异步任务

   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();
        

    

这段代码可以正常工作。但我怀疑我们是否需要一个字符串类型的变量来捕获 AsyncTask 的返回值。这里没有使用变量,它只是写成task.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");。为什么这不会引发错误。谁能解释一下。我是 Android 新手。

【问题讨论】:

@user:10819573 你能看看吗 【参考方案1】:

AsyncTask.execute(Params... params) 的返回值就是documentation 中说明的任务本身,这样你就可以保留它的引用。如果你只是忽略返回值,这不会导致错误。

AsyncTask 异步工作。这就是您稍后在AsyncTaskonPostExecute(Result result) 方法中检索结果的原因。此方法在 UI 线程上运行,因此您可以在那里更新视图等。

【讨论】:

以上是关于我们需要捕获 AsyncTask 的返回值吗?的主要内容,如果未能解决你的问题,请参考以下文章

React 钩子需要返回一个值吗?

android AsyncTask 怎么返回值给UI线程

AsyncTask:doInBackground() 的返回值去哪了?

!a!=!!b^!!-!a||!+!a|!c 可以返回 1 以外的任何值吗?

您可以从 Redshift 中的 python UDF 返回多个值吗?

AsyncTask 坑 多个task是串行执行还是并行的