为什么在应用程序运行时调用onResume()?

时间:2013-12-12 09:21:19

标签: android android-lifecycle onresume

根据answerCommonsWare

  每当活动重新获得前景时,都会调用

onResume()   输入。这包括:

     
      
  • 在其他人拥有之后返回屏幕时   前景(例如,设置)和

  •   
  • 在此过程中第一次创建时(其中   包括任何新的过程,因为你杀了旧的过程   DDMS)

  •   
     

因此,您的代码将检查振铃模式的状态   在任何一种情况下都会使用正确的图像。

但就我而言,在应用程序运行时正在调用onResume()而没有任何上述条件。 onResume()使用refresh()方法显示ProgressBar,在WebView中加载一些内容,然后隐藏ProgressBar并显示WebView

请注意,它并不总是会发生,但大部分时间都会发生。

我真的很想知道为什么会这样,如果可能的话,我怎么能阻止它,因为用户看到它真的很烦人。

代码:

public void refresh()
{
        webView.clearCache(true);
        layout.setVisibility(View.GONE);
        progress.setVisibility(View.VISIBLE);
        fetcher = new DataFetcher();

        String url = "http...." // some url
        fetcher.execute(url);
}

public void onResume()
{
        super.onResume();
        refresh();
}

修改的 这是我在Thread.dumpStack()之后得到的(这些在logcat中显示两次,因此onResume()被调用两次):

12-12 10:36:22.033: W/HardwareRenderer(22358): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:36:24.947: W/HardwareRenderer(22358): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:36:26.744: W/HardwareRenderer(22358): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:36:27.064: W/System.err(22358): java.lang.Throwable: stack dump
12-12 10:36:27.088: W/System.err(22358):    at java.lang.Thread.dumpStack(Thread.java:496)
12-12 10:36:27.088: W/System.err(22358):    at com.example.app.menufragments.SalesByPointsFragment.onResume(SampleFragment.java:101)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.Fragment.performResume(Fragment.java:1543)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:963)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1894)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:466)
12-12 10:36:27.088: W/System.err(22358):    at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:455)
12-12 10:36:27.088: W/System.err(22358):    at com.actionbarsherlock.app.SherlockFragmentActivity.onPostResume(SherlockFragmentActivity.java:68)
12-12 10:36:27.088: W/System.err(22358):    at android.app.Activity.performResume(Activity.java:5195)
12-12 10:36:27.088: W/System.err(22358):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2860)
12-12 10:36:27.088: W/System.err(22358):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2899)
12-12 10:36:27.088: W/System.err(22358):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
12-12 10:36:27.088: W/System.err(22358):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 10:36:27.088: W/System.err(22358):    at android.os.Looper.loop(Looper.java:137)
12-12 10:36:27.088: W/System.err(22358):    at android.app.ActivityThread.main(ActivityThread.java:5227)
12-12 10:36:27.096: W/System.err(22358):    at java.lang.reflect.Method.invokeNative(Native Method)
12-12 10:36:27.096: W/System.err(22358):    at java.lang.reflect.Method.invoke(Method.java:511)
12-12 10:36:27.096: W/System.err(22358):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
12-12 10:36:27.096: W/System.err(22358):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
12-12 10:36:27.096: W/System.err(22358):    at dalvik.system.NativeStart.main(Native Method)

我还将Thread.dumpStack()放在onPause(),并且日志再次以:

开头
12-12 10:55:38.502: W/HardwareRenderer(29996): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:55:38.572: W/HardwareRenderer(29996): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:55:46.369: W/HardwareRenderer(29996): Attempting to initialize hardware acceleration outside of the main thread, aborting
12-12 10:55:50.736: W/HardwareRenderer(29996): Attempting to initialize hardware acceleration outside of the main thread, aborting

我认为这与WebView有关,也许密集工作会暂停和恢复?


我也得到了编舞的警告。这一切都发生在WebView,因为它显示了javascript图表。 WebView是否在主线程中进行处理?

2 个答案:

答案 0 :(得分:3)

根据活动生命周期,除非它首先onResume(),否则它一旦运行就不可能onPause()

enter image description here

你是否暂停了应用程序?也许关闭屏幕(甚至自动)?或者在活动之间改变?如果没有,我会检查你是否在代码的其他部分更改了ProgressBar和WebView,似乎问题不在onResume上。

你总是可以写一个Log.i(tag, string),看看它何时进入方法。

我想评论而不是回答,但我没有足够的声誉,抱歉。

答案 1 :(得分:0)

只是一个小小的更新。虽然活动生命周期另有说明,但 调用onResume两次。但它只在调试时发生,而不是正常情况。所以这可能是一个错误。