2013-05-24 4 views
2

Я пытаюсь обновить журнал вызовов после нажатия кнопки. У меня есть одновременно Ури и 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; 
     } 
    } 


} 
+0

вы обновили свой список с ЭВ курсором ?? – stinepike

+0

Не мог бы вызвать функцию с помощью курсора (c) обновить ее? – Dzinic

+0

извините не понимаю. пожалуйста, напишите полный код checklog – stinepike

ответ

2

используйте устройство CursorLoader, чтобы запросить курсор, содержащий записи журнала вызовов. CursorLoader будет автоматически обновляться, когда журналы вызовов будут изменены, поэтому вам не придется беспокоиться об обновлении дисплея вручную (если вам нужно было обновить вручную, вы можете сделать это, используя метод LoaderManagerrestartLoader()).

+0

Не могли бы вы дать мне быстрый пример того, как я могу использовать cursorloader в этом случае? Я читал об этом, но я не могу понять, как он работает. – Dzinic

-1

я на самом деле получил его на работу со следующим кодом

case (R.id.menuRefresh): 
     allCalls = Uri.parse("content://call_log/calls"); 
     layout.removeAllViews(); 
     arrlst.clear(); 
     checkLogs(); 
+0

Вы должны принять этот ответ, если это решение, которым вы удовлетворены. «CursorLoader» определенно является рекомендуемым решением, хотя ... и это упростит ваш код WAY. Просмотрите мои [** сообщения в блоге **] (http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html) на 'Loader's. –

+0

Как выполнить запрос при использовании CursorLoader? я сделал следующие 'clC.setUri (allCalls);' \t \t 'clC.setSortOrder (sOrder);' \t \t 'C = CLC.loadInBackground(); 'где c - это курсор, а cLc - CursorLoader, но приложение разбилось, когда оно вызывало checkLogs при запуске. Извините, если вопрос прямо, но я не могу найти много ресурсов, чтобы научить меня этим загрузчикам, они новы для меня. – Dzinic

+1

Нет, это не так, как это работает. Вы не запрашиваете 'CursorLoader', вызывая его методы напрямую ... вы указываете' LoaderManager' инициализировать 'CursorLoader', а' LoaderManager' вызывает вместо этого методы 'CursorLoader' (т. Е. Когда он обнаруживает, что новый имеются данные). Вы должны проверить [** документацию **] (http://developer.android.com/reference/android/app/LoaderManager.html) для 'LoaderManager' ... есть также пример кода на моем [ ** blog post **] (http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html), иллюстрирующий основную концепцию того, как это работает –

Смежные вопросы