0

Fragmentデータをフェッチするためにローダーに依存しているAndroidアプリケーションがあります。以下は私ののスケルトンコードですFragmentonLoadFinishedメソッドにカスタムコードがあることを除いて、すべて同じです。

public class Events extends Fragment implements LoaderCallbacks<ArrayList<Event>> {    
    private Integer intWeek;

    public static Events newInstance(Integer intWeek) {    
        Events pageFragment = new Events();
        pageFragment.intWeek = intWeek;
        pageFragment.setArguments(new Bundle());
        return pageFragment;    
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.events, null);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);
    }

    public Loader<ArrayList<Event>> onCreateLoader(int intLoader, Bundle bndBundle) {
        return new Scraper(getActivity().getApplicationContext());
    }

    public void onLoadFinished(Loader<ArrayList<Event>> ldrEvents, final ArrayList<Event> lstEvents) {    
        //Do something with the returned data
    }

    public void onLoaderReset(Loader<ArrayList<Event>> ldrEvents) {
        return;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }    
}

これは、そのFragmentPagerAdapter`を取得するを使用するFragment内部で使用されます。FragmentActivityViewPagerFragment´s using a

これは正常に機能し、上記のようにページ間を移動できますFragmentFragmentにnewが追加されるたびViewPagerに、onCreateメソッドが起動し、newが作成されますLoader

携帯電話の「ホーム」ボタンを押すと、アプリケーションが一時停止してバックグラウンドになります。私はいつでもアプリケーションを復元でき、バックグラウンドで5/10/20分経過した後でも問題なく動作します。

...しかし、アプリケーションをバックグラウンドで1時間以上長時間放置すると、起動時にアプリケーションがクラッシュし、スタックトレースがonCreateメソッドの次の行を指します。

        getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);

今、私はなぜこれが起こっているのかについて非常に迷っています。Androidフレームワークは、バックグラウンドで長期間非アクティブになった後、バックグラウンドで何かを破壊しているようで、initLoaderメソッドはを作成できませんLoaderメソッドに関するドキュメントには、initLoader具体的に次のように記載されています。

ローダーが初期化されてアクティブになっていることを確認します。ローダーがまだ存在しない場合は、ローダーが作成され、(アクティビティ/フラグメントが現在開始されている場合)ローダーが開始されます。それ以外の場合は、最後に作成されたローダーが再利用されます。

私がここで間違っていることを誰かが指摘できるでしょうか?これは、自由に複製できないため、デバッグが非常に難しい問題のようです。それは非常にランダムです。ありがとう


logcatからのスタックトレース:

Transmitting stack trace: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mridang.stadi/com.mridang.stadi.Main}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)    
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)    
    at android.app.ActivityThread.access$600(ActivityThread.java:132)    
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)    
    at android.os.Handler.dispatchMessage(Handler.java:99)    
    at android.os.Looper.loop(Looper.java:137)    
    at android.app.ActivityThread.main(ActivityThread.java:4575)    
    at java.lang.reflect.Method.invokeNative(Native Method)    
    at java.lang.reflect.Method.invoke(Method.java:511)    
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)    
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)    
    at dalvik.system.NativeStart.main(Native Method)    
Caused by: java.lang.NullPointerException    
    at com.mridang.stadi.events.Events.onCreate(Events.java:73)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)    
    at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1805)    
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)    
    at com.mridang.stadi.Main.onCreate(Main.java:23)    
    at android.app.Activity.performCreate(Activity.java:4465)    
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)    
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)    
    ... 11 more
4

2 に答える 2

1

私はローダーで同様の問題に遭遇しました。私が見つけたのは、フラグメント/ローダーのライフサイクルが複雑であるということです。それを詳しく説明しているドキュメントを見つけたいです。

とにかく、問題を修正するために私がしたことは、initLoader()呼び出しをonActivityCreated()メソッドに移動することでした。それを試してみてください。

于 2012-10-31T11:30:22.690 に答える
0

次のようなものを使用してみてください。

boolean canFire = ((loader != null) && !loader.isReset());
            // restart or initialise loader
            if (canFire) {
                getLoaderManager().restartLoader(loaderId, args, this);
            } else {
                getLoaderManager().initLoader(loaderId, args, this);
            }
于 2013-03-28T09:43:04.860 に答える