Android为什么操作系统问题onPause()

时间:2012-06-12 14:59:29

标签: android android-asynctask onresume onpause

我的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

2 个答案:

答案 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时,会产生第二次暂停/停止。

我正在给克里斯答案,因为他的评论让我思考并重新思考,直到我发现了正在发生的事情。