2

アプリの1つをFragmentsを使用するように変換しようとしています。このアプリもAndroidライセンスチェッカーを使用しています。テスト中に、ライセンスチェッカーコードをコメントアウトしてもらい、アプリが希望どおりに動作するようになりました。これで、そのコードのコメントを解除してマーケットに戻す準備ができましたが、そうすると、アプリを起動するたびに次のメッセージが表示されます。

java.lang.IllegalStateException:フラグメントMainHomeFragment{40544bd8}がアクティビティにアタッチされていません

これは、電話またはエミュレーターでテストした場合に発生します。ライセンスチェッカーが十分な速度で終了していないように思われるため、フラグメントを膨らませたときに、それをアタッチするアクティビティがありません。最初はアプリを起動し、アプリが読み込まれたら戻るボタンを押して、すぐに再試行しました。ライセンスチェッカーは最初の試行からまだ実行されている可能性があると思ったので、次に戻るキーを使用する前に5分間待っても、同じ問題が発生します。奇妙なことに、アプリが2回目に爆発した後、もう一度試してみると機能しますが、4回目の試行では再び失敗するため、成功した最初の試行から何かがクリアされてはなりません。LicenseCheckerコードをコメントアウトして再度実行すると、毎回機能します。LicenseCheckerの呼び出しをスレッドとして新しいクラスに入れてみたので、作成中のアクティビティが保持されないようになりましたが、同じ問題が発生します。これを修正するために何を試みるべきかについてのアイデアはありますか?

これが私のメインの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);
}
4

2 に答える 2

0

最初にsetContentViewビューの読み込みを実行し、ライセンス手順を完了した後setContentView、フラグメントを「実際に」実行してみませんか?

私はそれがうまくいくと思います。

于 2011-10-26T20:09:23.263 に答える
0

私はこれが本当に古いことを知っています、しかし私はまだ私の2セントを入れます。

どのように追加するのFragmentか(XML<fragment>タグを使用するのか、それともFragmentTransaction。を使用するのか)、特定の場合にのみFragment追加する場合(ライセンスチェッカーがOKなどを返す場合)は、質問で明確ではありません。プログラムでフラグメントを追加することをお勧めします。

FrameLayoutしたがって、基本的には、、またはその他のレイアウト内に「Loading ...」ビューを定義してFragmentTransactionから、そのレイアウトオブジェクトにあるものを新しい。に置き換えますFragment

私がこれを行う方法は、を使用することThreadです。AsyncTaskすべてのバックグラウンドジョブが1つのスレッドを共有するため、私は非常に嫌いです。同期は少し簡単になりますが、ダウンロードやネットワークジョブが多い場合は、パフォーマンスに大きな影響を与える可能性があります。たとえば、次々とキューに入れられ、長いジョブを起動すると、他のすべてのバックグラウンドジョブが遅延するためです。実行中。

UIスレッドで実行するために別のオブジェクトが必要なため、 2つのRunnableオブジェクト( )を定義します(バックグラウンドスレッドからUIを操作すると、が得られます)。implements RunnableException

したがって、基本的に、Runnableによって実行される最初のオブジェクトでThread、呼び出し元への参照を受け取り、Activityそれをインスタンス変数として保存します。次に、その参照を使用して、次RunnableのようにUIスレッドで2番目のオブジェクトを実行します(これはrunメソッド の最後で行います。そこにプログラムcallingActivity.runOnUiThread(new RunnableToRunOnUIThread());で追加します。Fragment

于 2013-12-20T13:30:40.527 に答える