如何从AsyncTask返回布尔值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从AsyncTask返回布尔值?相关的知识,希望对你有一定的参考价值。

我有一个检查网络连接然后检查服务器可用性的功能。如果有网络连接,它将接下来检查服务器可用性。不幸的是,检查服务器可用性是通过AsyncTask

这就是我想要使用AsyncTask的方式:

if(NetworkConnectionInfo(context).execute()) { 
    return true 
} else { 
   return false 
}

这是NetworkConnectionInfo

    class NetworkConnectionInfo : AsyncTask<String, String, Boolean> {

    private var context: Context? = null

    constructor(context:Context):super(){
        this.context = context
    }

    override fun onPreExecute() {}

    override fun doInBackground(vararg p0: String?): Boolean {
        try {
            val url = URL("http://www.example.com/")
            val urlc = url.openConnection() as HttpURLConnection
            urlc.setRequestProperty("User-Agent", "test")
            urlc.setRequestProperty("Connection", "close")
            urlc.setConnectTimeout(1000) // mTimeout is in seconds
            urlc.connect()

            return urlc.getResponseCode() === 200

        } catch (ex:Exception) {
            ex.printStackTrace()
        }
        return false
    }

    override fun onProgressUpdate(vararg values: String?) {}

    override fun onPostExecute(success: Boolean) {
        if(!success) {
            Toast.makeText(this.context,"Error connecting server. Please try again later.", Toast.LENGTH_LONG).show()
        } else {
            Toast.makeText(this.context,"Server is available.", Toast.LENGTH_LONG).show()
        }
    }
}

我想在success返回onPostExecute。我不知道如何处理这个问题。

答案

AsyncTask没有返回值,因为它是异步的。

你必须直接在回调函数success中使用结果(onPostExecute)。这就是AsyncTask的设计和应该如何使用。

override fun onPostExecute(success: Boolean) {
   // call further functions depending on "success"
   // Note: can access views since it runs on the UI thread
}

以上是关于如何从AsyncTask返回布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

从Asynctask ONPostExecute调用片段方法

如何在切换片段时停止 AsyncTask?

无法从 AsyncTask 返回值;使用接口和委托;

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

如何从大量可为空的布尔值中返回布尔值?

如何从选项卡片段中的 AsyncTask Resftful WS 加载批量数据