我有与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
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()
}
}
}