意见不是从的AsyncTask的回调更新方向更改后

问题描述 投票:0回答:1

我有与retainedInstance =真,在其onCreate()方法中定义的片段的活性,所述片段会做一些网络,然后将其发送数据返回给活性。

这是我的回调函数

override fun updateUi(result: ArrayList<Person>?) {
    progressBar.visibility = View.GONE
    window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    if (result != null) {
        setAdapter(result)
    }
    else {
        finishNetworking()
        val snackBar = Snackbar.make(findViewById(R.id.root_layout),
            "Network failure", Snackbar.LENGTH_INDEFINITE)
        snackBar.setAction("Try again") {
            startDownload()
        }
        snackBar.show()
    }
}

这是我的活动的onCreate()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    viewManager = LinearLayoutManager(this)
    progressBar = findViewById(R.id.progress_bar)
    recyclerView = findViewById<RecyclerView>(R.id.recycler_view).apply {
        setHasFixedSize(true)
        layoutManager = viewManager
    }

    if (savedInstanceState == null) {
        hasArgs = false
        networkFragment = NetworkFragment.getInstance(supportFragmentManager, SWAPI_URL_PEOPLE, null)
    }
    else {
        hasArgs = true
        networking = savedInstanceState.getBoolean("networking", false)
        if (networking) {
            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
            progressBar.visibility = View.VISIBLE

        }
        if (savedInstanceState.getParcelableArrayList<Person>("persons") != null) {
            setAdapter(savedInstanceState.getParcelableArrayList<Person>("persons") as ArrayList<Person>)
        }
    }

}

继承人是我的AsyncTask

private class NetworkTask(
    callback: NetworkCallback<ArrayList<Person>>,
    person: Person?
)
    : AsyncTask<String, Int, NetworkTask.Result>() {

    private val mCallback: NetworkCallback<ArrayList<Person>>? = callback
    private val mPerson: Person? = person

    internal class Result {
        var mResultValue: ArrayList<Person>? = null
        var mException: Exception? = null

        constructor(resultValue: ArrayList<Person>?) {
            mResultValue = resultValue
        }

        constructor(exception: Exception) {
            mException = exception
        }
    }

    override fun onPreExecute() {

        if (mCallback != null) {

            if (Build.VERSION.SDK_INT < 23) {
                val networkInfo = mCallback.getConnectivityManager().activeNetworkInfo
                if (networkInfo?.isConnected == false
                    || networkInfo?.type != ConnectivityManager.TYPE_WIFI
                    && networkInfo?.type != ConnectivityManager.TYPE_MOBILE) {
                    mCallback.updateUi(null)
                    cancel(true)
                }
            }
            else {
                val network = mCallback.getConnectivityManager().activeNetwork
                val networkCapabilities = mCallback.getConnectivityManager().getNetworkCapabilities(network)
                if (networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false &&
                    !networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    mCallback.updateUi(null)
                    cancel(true)
                }
            }
        }
    }

    override fun doInBackground(vararg urls: String): Result? {
        var result: Result? = null
        if (!isCancelled && urls.isNotEmpty()) {
            val urlString = urls[0]
            result = try {
                val resultString = downloadUrl(urlString)
                if (resultString != null) {
                    val persons = ArrayList<Person>()
                    if (mPerson == null) {
                        Result(getAllPersons(urlString, persons))
                    }
                    else {
                        persons.add(getPersonHomeworldAndVehicles(urlString, mPerson))
                        Result(persons)
                    }
                } else {
                    throw IOException("No response received.")
                }
            } catch (e: Exception) {
                Result(e)
            }

        }
        return result
    }


    override fun onPostExecute(result: Result?) {
        mCallback?.apply {
            result?.mException?.also { exception ->
                updateUi(null)
                return
            }
            result?.mResultValue?.also { resultValue ->
                updateUi(resultValue)
                return
            }
            finishNetworking()
        }
    }

问题是后,我旋转设备,当我从收到的AsyncTask回调,我的看法没有更新,因为进度栏仍是可见的,当我设置progressBar.visibility = View.GONE

android android-fragments kotlin android-asynctask
1个回答
0
投票

OK所以现在我看到你打电话callback.updateUi()形成的AsyncTask功能。这会导致问题,因为当你在异步TAKS执行操作你是在非UI线程。为了避免这个问题,你需要调用runOnUiThread()里面你温控功能override fun updateUi(result: ArrayList<Person>?)()和环绕与runOnUiThread块中的所有UI相关的代码。

例:

override fun updateUi(result: ArrayList<Person>?) {

        runOnUiThread {
            progressBar.visibility = View.GONE
            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
            if (result != null) {
                setAdapter(result)
            } else {
                finishNetworking()
                val snackBar = Snackbar.make(findViewById(R.id.root_layout),
                        "Network failure", Snackbar.LENGTH_INDEFINITE)
                snackBar.setAction("Try again") {
                    startDownload()
                }
                snackBar.show()
            }
        }

    } 
© www.soinside.com 2019 - 2024. All rights reserved.