Fragment的IllegalStateException未附加到Activity

时间:2011-10-26 19:52:12

标签: android android-activity android-lvl

我正在尝试将我的某个应用转换为现在使用片段。此应用程序还使用Android许可证检查程序。在测试时,我将许可证检查器代码注释掉,现在让应用程序像我想要的那样工作。我现在准备取消注释该代码,以便我可以将它放回市场,但是当我这样做时,我每隔一段时间就会收到此消息:

java.lang.IllegalStateException:片段MainHomeFragment {40544bd8}未附加到Activity

如果我在手机或模拟器上进行测试,就会发生这种情况。几乎看起来许可证检查程序没有足够快地完成,因此当它膨胀碎片时没有活动将它附加到。起初我只是启动应用程序,然后在加载后按下后退按钮并立即再次尝试。我认为许可证检查程序可能仍然在第一次尝试时运行,因此下次我在使用后退键之前等待5分钟仍然会遇到同样的问题。奇怪的是,应用程序第二次爆炸,如果我再次尝试它可行,但在第四次尝试它再次失败,所以一定不能从第一次成功的尝试清除。如果我注释掉LicenseChecker代码并再次运行它,它每次都有效。我尝试将一个新的类中的LicenseChecker调用作为一个线程,这样它就不会阻止正在创建的Activity但仍然会遇到同样的问题。关于我应该尝试解决这个问题的任何想法?

以下是我的主要FragmentActivity的onCreate代码:

public void onCreate(Bundle savedInstanceState) {      
  super.onCreate(savedInstanceState);

  ConnectivityManager connectivityManager 
    = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  NetworkInfo activeNetwork = 
    connectivityManager.getActiveNetworkInfo();

  if (activeNetwork != null) { 
    android_id = Secure.getString(this.getContentResolver(), 
      Secure.ANDROID_ID);
    mObsfuscator = new AESObfuscator(SALT, getPackageName(), android_id);
    ServerManagedPolicy serverPolicy = new 
      ServerManagedPolicy(this, mObsfuscator);
    mLicenseCheckerCallback = new MyLicenseCheckerCallback();
    mChecker = new LicenseChecker(this, serverPolicy,
      BASE64_PUBLIC_KEY);
    mChecker.checkAccess(mLicenseCheckerCallback);
  } 

  setContentView(R.layout.fragment_layout);
}

2 个答案:

答案 0 :(得分:0)

为什么不首先使用加载视图执行setContentView,然后在完成许可程序后,使用您的片段执行“真实”setContentView

我认为这样可行。

答案 1 :(得分:0)

我知道这真的很老了,但我还是会花2美分。

在您的问题中,您不清楚如何添加Fragment(无论是通过XML <fragment>标记,还是使用FragmentTransaction。无论您正在做什么,如果您只是想要在某种情况下添加Fragment(如果许可检查器返回OK或其他)我建议您以编程方式添加片段。

所以基本上,在FrameLayout或任何其他布局中定义“加载...”视图,然后使用FragmentTransaction,用新Fragment替换该布局对象中的任何内容。 1}}。

我这样做是为了Thread。我非常不喜欢AsyncTask因为它使所有后台作业共享一个线程。它使同步变得更容易,但是如果你有大量的下载/网络作业,可能会影响性能,例如,因为它一个接一个地排队,并且启动一个长作业将延迟所有其他后台作业执行。

我定义了两个Runnable个对象(implements Runnable),因为你需要在UI线程上执行另一个(如果你从后台线程操作UI,你得到一个Exception)。

基本上,在Runnable执行的第一个Thread对象中,您会收到对调用Activity的引用,并将其另存为实例变量。然后,使用该引用在UI线程上执行第二个Runnable对象,就像这样(我在run方法的末尾执行此操作: callingActivity.runOnUiThread(new RunnableToRunOnUIThread());并在那里以编程方式添加Fragment