我的Activity
创建了一个AsyncTask
,用于加载文件中的数据并更新onProgressUpdate()
经典图书AsyncTask
上的用户界面。
但是,Android会在onPause()
启动后立即调整活动AsyncTask
。
我试图理解为什么(以及如何防止它)
这会导致所有AsyncTask
UI更新停止;然后,当AsyncTask
完成后,Activity
不会自行恢复,我必须触摸屏幕或按某个操作栏按钮将其转到onResume()
编辑:
这是logcat,(使用aLogcat应用程序来获取它)
<要使用新的完整日志>
进行更新临时(文件选择器后的第一个onPause()):
06-12 22:08:48.744 11302 11302 D Viewer: + optionsItemSelected(itemID:2131296267)
06-12 22:08:48.754 11302 11302 D Viewer: + showFileChooser(path:/mnt/sdcard/Android/data/com.delphi.app/files, requestCode:0)
06-12 22:08:48.754 11302 11302 D Viewer: + onResume()
06-12 22:08:48.754 11302 11302 D Viewer: + onSaveInstanceState(outState:Bundle[{}])
06-12 22:08:48.754 11302 11302 D Viewer: + onPause()
06-12 22:08:48.754 189 443 I ActivityManager: START {act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras)} from pid 11302
06-12 22:08:48.764 189 489 D WindowManager: adjustConfigurationLw, config:{1.0 0mcc0mnc (no locale) layoutdir=0 sw800dp w800dp h1232dp xlrg port ?uimode ?night finger -keyb/v/h -nav/v} mLidOpen:-1 mHasDockFeature:true mHasHallSensorFeature:true config.hardKeyboardHidden:2
06-12 22:08:48.764 11302 11304 D dalvikvm: GC_CONCURRENT freed 244K, 5% free 6748K/7047K, paused 2ms+3ms
临时(第二个onPause(),有问题的一个):
06-12 22:09:00.324 11302 11350 I LoaderTask: Publishing message 13
06-12 22:09:00.324 11302 11350 I LoaderTask: Adding message 14
06-12 22:09:00.324 11302 11350 I LoaderTask: Publishing message 14
06-12 22:09:00.354 11302 11350 I LoaderTask: Adding message 15
06-12 22:09:00.354 11302 11302 D MessageTable: + onLayout(changed:false, l:0, t:0, r:800, b:20)
06-12 22:09:00.354 11302 11350 I LoaderTask: Publishing message 15
06-12 22:09:00.364 11302 11302 D MessageTable: + getColumns()
06-12 22:09:00.364 11302 11302 D MessageTable: + getRowCount()
06-12 22:09:00.364 11302 11302 D MessageTable: + getRowAt(index:-1)
06-12 22:09:00.364 11302 11302 D MessageRow: + getColumns()
06-12 22:09:00.364 11302 11302 D MessageTable: + setHeaderColumns(cols:[I@41125668)
06-12 22:09:00.364 11302 11302 D MessageRow: + setColumns(cols:[I@41125668)
06-12 22:09:00.364 11302 11302 D Viewer: + onSaveInstanceState(outState:Bundle[{}])
06-12 22:09:00.364 11302 11302 D Viewer: + onPause()
06-12 22:09:00.364 11302 11302 D LoaderTask: + getState()
06-12 22:09:00.364 11302 11302 D LoaderTask: + pause()
06-12 22:09:00.364 189 489 D WindowManager: adjustConfigurationLw, config:{1.0 0mcc0mnc (no locale) layoutdir=0 sw800dp w800dp h1232dp xlrg port ?uimode ?night finger -keyb/v/h -nav/v} mLidOpen:-1 mHasDockFeature:true mHasHallSensorFeature:true config.hardKeyboardHidden:2
应用程序结构,根据要求添加:
MainActivity
Launch Viewer Activity on Button click
Viewer Activity
Show layout, has a MessageTable (TableLayout)
Launch ShowFileChosser to choose a Records file
Execute LoaderTask with given file
LoaderTask
Open given file
doInBackground()
Read one record
Add the record to an ArrayList
if not paused Publish record
onProgressUpdate()
Show record in MessageTable
答案 0 :(得分:1)
06-12 18:21:09.394 9512 9512 D Viewer: + onStop()
06-12 18:21:14.684 9512 9512 D Viewer: + onActivityResult(requestCode:0, resultCode:-1, data:Intent { dat=file:///mnt/sdcard/Download/Records.11111.MyLog.gzip })
你已经过滤了logcat,因此很难看到所发生的一切,但看起来你正在使用Intent从这个5秒的差距中获取另一个活动的东西(文件名?)。
你应该在转移到另一个活动的任何时候都期望onPause() - onResume()循环。
答案 1 :(得分:1)
我终于找到了多个onPause()调用的原因。在我的情况下,有多次调用ShowFileChooser()。
正如克里斯·斯特拉顿指出的那样,转移到另一个活动之后会有onPause(),在这种情况下,在调用ShowFileChooser()之后。
当我选择一个文件(调用onStop())然后根据众所周知的活动生命周期重新启动时,Viewer的活动停止。然后再次调用ShowFilechooser时,会产生第二次暂停/停止。
我正在给克里斯答案,因为他的评论让我思考并重新思考,直到我发现了正在发生的事情。