如何从AsyncTask中返回Boolean值?服务器可用性检查实现疑问
解决AsyncTask无法直接返回结果的问题
你遇到的核心问题是AsyncTask的异步执行特性:execute()方法只是启动后台任务,会立刻返回AsyncTask实例,不会等待doInBackground完成;而onPostExecute是在主线程运行的void方法,没法直接把结果返回给调用处。想要拿到服务器检查的结果,推荐用回调接口的方式,这是Android处理异步结果的标准做法,下面是具体实现:
方案一:使用回调接口(推荐)
1. 定义回调接口
先创建一个接口,用来传递检查结果的回调:
interface ServerCheckCallback { // 服务器可用时调用 fun onServerAvailable() // 服务器不可用或网络失败时调用 fun onServerUnavailable() }
2. 修改NetworkConnectionInfo类
把回调接口作为参数传入AsyncTask,在onPostExecute里触发回调:
class NetworkConnectionInfo( private val context: Context, private val callback: ServerCheckCallback ) : AsyncTask<String, String, Boolean>() { override fun doInBackground(vararg p0: String?): Boolean { return try { val url = URL("http://www.example.com/") val urlc = url.openConnection() as HttpURLConnection urlc.setRequestProperty("User-Agent", "test") urlc.setRequestProperty("Connection", "close") urlc.connectTimeout = 1000 // Kotlin中直接用属性赋值,替代Java的setter urlc.connect() urlc.responseCode == 200 } catch (ex: Exception) { ex.printStackTrace() false } } override fun onPostExecute(success: Boolean) { super.onPostExecute(success) // 先显示Toast val message = if (success) { "Server is available." } else { "Error connecting server. Please try again later." } Toast.makeText(context, message, Toast.LENGTH_LONG).show() // 触发回调,把结果传递给调用处 if (success) { callback.onServerAvailable() } else { callback.onServerUnavailable() } } }
3. 调用方式
使用匿名内部类实现回调接口,在对应的方法里处理结果:
NetworkConnectionInfo(context, object : ServerCheckCallback { override fun onServerAvailable() { // 这里写服务器可用时的逻辑,相当于你原来想要return true的场景 // 比如更新UI、执行后续业务操作 } override fun onServerUnavailable() { // 这里写服务器不可用时的逻辑,相当于你原来想要return false的场景 } }).execute()
方案二:同步等待结果(不推荐)
如果你一定要像同步方法那样直接拿到结果,可以用AsyncTask的get()方法,但绝对不要在主线程调用——这会阻塞主线程,导致界面卡顿甚至ANR(应用无响应):
// 注意:必须在子线程中执行这段代码! val task = NetworkConnectionInfo(context) task.execute() val result = task.get() // 阻塞当前线程,直到任务完成 if (result) { // 处理服务器可用逻辑 } else { // 处理服务器不可用逻辑 }
为什么不推荐?因为Android主线程有严格的超时限制(5秒),如果网络请求超时超过这个时间,系统会弹出ANR提示,严重影响用户体验。所以优先用方案一的回调方式。
内容的提问来源于stack exchange,提问作者Heero Yuy
相关产品推荐
相关产品推荐

