按下按钮后,我正在尝试刷新通话记录。我同时定义了 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;
}
当我按下刷新时,新调用不会出现,但是当我关闭并打开应用程序时它们会出现。我究竟做错了什么?
尝试使用 Loader 时的错误日志
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;
}
}
}