2011-10-26 25 views
2

私のアプリケーションの1つにフラグメントを使用するように変換しようとしています。このアプリは、Androidライセンスチェッカーも使用しています。テスト中に私はライセンスチェッカーコードをコメントアウトしていましたが、今ではアプリが好きなように機能しています。私は今すぐ市場に戻すことができるようにそのコードのコメントを解除する準備ができていますが、私は私がこのメッセージを毎回私はアプリを起動するたびに取得する:フラグメントにアクティビティに添付されていないフラグメントのIllegalStateException

java.lang.IllegalStateException:フラグメントMainHomeFragment {40544bd8} toアクティビティ

これは電話機またはエミュレータでテストした場合に発生します。ライセンスチェッカーが十分に速く終了していないように見えるので、フラグメントを膨らませるときに、それを接続するアクティビティはありません。最初はアプリを起動してすぐにもう一度ロードボタンを押すだけでした。私はライセンスチェッカーが最初の試行からまだ実行していたかもしれないと思ったので、次回に5分待ってからバックキーを使用しても同じ問題が発生します。奇妙なことは、アプリが2回目に爆発した後で、もう一度試してみると4回目に失敗します。何かが成功した最初の試合からクリアされてはならないということです。 LicenseCheckerコードをコメントアウトして再度実行すると、毎回動作します。私はThreadとして新しいクラスに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); 
} 
+0

この問題に関する更新。私はライセンスチェッカーで、ライセンスチェッカーが共有環境設定で何回失敗したかをカウントしていることを忘れていました。これは、毎回失敗してしまったと思う少数のユーザーがいたからです私がSharedPreferenceEditorのcommit()だけをコメントアウトすると、エラーは消えますが、入れようとしている値は保存されません。それが実行されるたびに唯一の理由は何ですか? – Chris

答えて

0

あなたが最初にロードビューとsetContentViewを行い、その後、ライセンスの手続きを終えた後、あなたはあなたのでsetContentView「本物」を実行していないのはなぜ断片?

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

+0

Sometimライセンスチェックに数秒かかることがあります。ユーザーにメイン画面を表示するのにアプリが長時間かかることは望ましくありません。フラグメント化されたライセンスサーバーを使用している人はいませんか? – Chris

0

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

それはあなたが(XML <fragment>タグ経由か、またはFragmentTransactionFragmentを追加しているどのようにあなたの質問に明確ではありません。あなたがやっているものは何でも、あなたが唯一の特定の場合にはFragment追加したい場合は(場合ライセンスチェッカーがOKか何かを返します)

基本的に、FrameLayout、または他のレイアウト内の「読み込み中...」ビューを定義してから、FragmentTransactionを置き換えますあなたの新しいレイアウトのオブジェクトには何が入っていますかFragment

私のやり方はThreadです。私はAsyncTaskを非常に強く嫌っています。なぜなら、すべてのバックグラウンドジョブが1つのスレッドを共有するからです。同期を少し簡単にしますが、ダウンロード/ネットワークジョブがたくさんある場合はパフォーマンスに実際に影響を与えることがあります。たとえば、待ち行列の種類が増え、長いジョブを起動すると他のすべてのバックグラウンドジョブが実行中。

UIスレッドで別のUIスレッドを実行する必要があるため(UIスレッドをバックグラウンドスレッドから操作する場合は、Exceptionになります)、TWO Runnableオブジェクトを定義します(implements Runnable)。

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

関連する問題