2

ボタンが押されたら通話ログを更新しようとしています。Uri と Cursor の両方が定義されています

Cursor c;
Uri allCalls = Uri.parse("content://call_log/calls");

そして、この関数はonCreateで呼び出されます

public void checkLogs() {
    c = getContentResolver().query(allCalls, null, null, null, sOrder);

    while (c.moveToNext()) {
        num = c.getString(c.getColumnIndex(CallLog.Calls.NUMBER)); // for
                                                                    // number
        if (num.startsWith("+1")) {
            num = num.substring(2);
        }
        name = c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME)); // for
                                                                            // name
        type = Integer.parseInt(c.getString(c
                .getColumnIndex(CallLog.Calls.TYPE))); // for type

        if (type == 3 && arrlst.contains(num) == false && name == null) {
            arrlst.add(num);
            initialize(num);
        }

        else {
            arrlst.add(num);
            continue;
        }
    }

    c.close();
}

これは機能しますが、次のコードを含む更新ボタンを作成してみました

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case (R.id.menuRefresh):
                allCalls = Uri.parse("content://call_log/calls");
                checkLogs();
    }
    return false;
}

更新を押しても新しい通話は表示されませんが、アプリケーションを閉じて開くと表示されます。私は何を間違っていますか?

ローダー使用時のエラーログ

05-25 02:31:14.724: E/AndroidRuntime(18892): FATAL EXCEPTION: main
05-25 02:31:14.724: E/AndroidRuntime(18892): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.callfinder/com.example.callfinder.FindCalls}: java.lang.NullPointerException
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread.access$600(ActivityThread.java:150)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.os.Looper.loop(Looper.java:137)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread.main(ActivityThread.java:5195)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at java.lang.reflect.Method.invokeNative(Native Method)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at java.lang.reflect.Method.invoke(Method.java:511)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at dalvik.system.NativeStart.main(Native Method)
05-25 02:31:14.724: E/AndroidRuntime(18892): Caused by: java.lang.NullPointerException
05-25 02:31:14.724: E/AndroidRuntime(18892):    at com.example.callfinder.FindCalls.checkLogs(FindCalls.java:171)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at com.example.callfinder.FindCalls.onCreate(FindCalls.java:55)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.Activity.performCreate(Activity.java:5104)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-25 02:31:14.724: E/AndroidRuntime(18892):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2260)
05-25 02:31:14.724: E/AndroidRuntime(18892):    ... 11 more

また、コメントで紛らわしい場合は説明しようとしたコード

public void initialize() {
    layout = (LinearLayout) findViewById(R.id.ll1);
    tvTitle = (TextView) findViewById(R.id.textView1);
    lp = new LayoutParams(LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    sOrder = String.format(sDate + " %s", sSort);

    mAdapter = new SimpleCursorAdapter(this, R.layout.activity_find_calls,
            null, null, null, 0);
    getLoaderManager().initLoader(0, null, this);

}

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    return new CursorLoader(this, allCalls,
            null, null, null, sOrder);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
      case 1:
          mAdapter.swapCursor(cursor);
          break;
    }

}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    mAdapter.swapCursor(null);

}

    public void checkLogs() {
    c = mAdapter.getCursor();
    //c = getContentResolver().query(allCalls, null, null, null, sOrder);

    while (c.moveToNext()) {
        num = c.getString(c.getColumnIndex(CallLog.Calls.NUMBER)); // for
                                                                    // number
        if (num.startsWith("+1")) {
            num = num.substring(2);
        }
        name = c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME)); // for
                                                                            // name
        type = Integer.parseInt(c.getString(c
                .getColumnIndex(CallLog.Calls.TYPE))); // for type

        if (type == 3 && arrlst.contains(num) == false && name == null) {
            arrlst.add(num);
            makeButton(num);
        }

        else {
            arrlst.add(num);
            continue;
        }
    }


}
4

2 に答える 2

3

a を使用しCursorLoaderて、コール ログ レコードを含むカーソルをクエリします。はCursorLoaderコール ログが変更されると自動的に更新されるため、表示を手動で更新する必要はありません (ただし、手動で更新する必要がある場合は、LoaderManagerrestartLoader()メソッドを呼び出して行うことができます)。

于 2013-05-24T05:21:38.540 に答える
-1

私は実際に次のコードで動作するようにしました

case (R.id.menuRefresh):
        allCalls = Uri.parse("content://call_log/calls");
        layout.removeAllViews();
        arrlst.clear();
        checkLogs();
于 2013-05-24T07:39:39.723 に答える