【问题标题】:How to correctly call getContentResolver() from within an onclick event如何从 onclick 事件中正确调用 getContentResolver()
【发布时间】:2013-08-23 14:15:12
【问题描述】:

我有一个按钮,其 onclick 处理程序定义如下:

    <Button
    android:id="@+id/ImportCalendar"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="34dp"
    android:onClick="icaltesting"
    android:paddingLeft="10dp"
    android:text="Import" />

现在我在我的活动类中定义了testing() 函数,我想使用 getContentResolver() 函数最终在我的 android 设备中创建本地日历。 我使用的代码如下:

public void icaltesting(View view) {
    Uri calUri = CalendarContract.Calendars.CONTENT_URI;
    ContentValues cv = new ContentValues();
    cv.put(CalendarContract.Calendars.NAME, "Test");
    cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "Local Calendar");
    cv.put(CalendarContract.Calendars.VISIBLE, 1);
    cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);

    calUri = calUri.buildUpon()
        .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "Test")
        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE,     CalendarContract.ACCOUNT_TYPE_LOCAL)
        .build();
    Uri result = getContentResolver().insert(calUri, cv);
  }

这是引发IllegalStateException: Could not execute method of the activity 的最后一行,应用程序强制关闭。我想我没有正确调用getContentResolver() 函数。我该如何解决这个问题?

编辑 1 相关的堆栈跟踪是这样的:

   08-23 20:05:56.580: E/AndroidRuntime(24197): FATAL EXCEPTION: main
   08-23 20:05:56.580: E/AndroidRuntime(24197): java.lang.IllegalStateException: Could not execute method of the activity
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.view.View$1.onClick(View.java:3044)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.view.View.performClick(View.java:3511)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.view.View$PerformClick.run(View.java:14105)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.os.Handler.handleCallback(Handler.java:605)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.os.Handler.dispatchMessage(Handler.java:92)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.os.Looper.loop(Looper.java:137)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.app.ActivityThread.main(ActivityThread.java:4575)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at java.lang.reflect.Method.invokeNative(Native Method)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at java.lang.reflect.Method.invoke(Method.java:511)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at dalvik.system.NativeStart.main(Native Method)
   08-23 20:05:56.580: E/AndroidRuntime(24197): Caused by: java.lang.reflect.InvocationTargetException
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at java.lang.reflect.Method.invokeNative(Native Method)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at java.lang.reflect.Method.invoke(Method.java:511)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.view.View$1.onClick(View.java:3039)
   08-23 20:05:56.580: E/AndroidRuntime(24197): Caused by: java.lang.IllegalArgumentException: the name must not be empty: null
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:166)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.content.ContentProviderProxy.insert(ContentProviderNative.java:415)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at android.content.ContentResolver.insert(ContentResolver.java:735)
   08-23 20:05:56.580: E/AndroidRuntime(24197):     at com.example.myfirstapp.CalendarTest.icaltesting(CalendarTest.java:117)

【问题讨论】:

    标签: android android-activity onclicklistener illegalstateexception


    【解决方案1】:

    我想如果您仔细查看堆栈跟踪,您会发现另一个异常。这个异常是根本原因。

    但实际上这并不重要。没有从 onClick 处理程序调用 getContentResolver() 的正确方法。您根本不应该在 UI 线程上使用它。改为安排AsyncTask

    更新:根据文档,您缺少几个必填字段

    插入

    插入新日历时,必须包含以下字段:

    ACCOUNT_NAME

    ACCOUNT_TYPE

    名字

    CALENDAR_DISPLAY_NAME

    CALENDAR_COLOR

    CALENDAR_ACCESS_LEVEL

    OWNER_ACCOUNT

    【讨论】:

    • 感谢您的回复。我实际上是在尝试实现一个对话框,因此我最初只是从AsyncTask 执行此操作,但这也不起作用。我肯定遗漏了一些东西。堆栈跟踪的最后 2 行可能与 contentResolver 有关。最后一行对应Uri result = getContentResolver().insert(calUri, cv);
    猜你喜欢
    • 2021-02-24
    • 2018-01-10
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多