【问题标题】:AppWidgetHost crash android.os.TransactionTooLargeExceptionAppWidgetHost 崩溃 android.os.TransactionTooLargeException
【发布时间】:2014-06-18 13:27:09
【问题描述】:

我正在开发一个自定义的 android 启动器。添加一些小部件(三星图库,收藏夹直拨)后,每次重新启动应用程序时都会崩溃。这是代码:

public static final int APPWIDGET_HOST_ID = 128;

    public final class Launcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        mAppWidgetManager = AppWidgetManager.getInstance(this);
        mAppWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID);
        mAppWidgetHost.startListening(); //Here it crash
        ...
    }
}

这是错误日志:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{custom.launcherpro/custom.launcher.launcher.Launcher}: java.lang.RuntimeException: system server dead?
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
    at android.app.ActivityThread.access$900(ActivityThread.java:161)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:157)
    at android.app.ActivityThread.main(ActivityThread.java:5356)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: system server dead?
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:166)
    at custom.launcher.launcher.Launcher.onCreate(Launcher.java:181)
    at android.app.Activity.performCreate(Activity.java:5426)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
    ... 11 more
 Caused by: android.os.TransactionTooLargeException
    at android.os.BinderProxy.transact(Native Method)
    at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.startListening(IAppWidgetService.java:465)
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:162)

这发生在 android 4.4 上(但即使在较旧的 android 版本上) 这是什么意思?我该如何预防?

谢谢你, 文森佐

【问题讨论】:

    标签: android widget launcher


    【解决方案1】:

    请参阅文档中的 TransactionTooLargeException。如果您查看 AppWidgetHost 的源代码,您会发现跟踪中提到的这段代码:

    ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>();
    // ....
    updatedIds = sService.startListening(mCallbacks, mPackageName, mHostId, updatedViews);
    

    在这种情况下,updatedViews 是一个 RemoteViews 数组。如果它们包含大量图像,它们可能会非常大。你有一些带有大图像的小部件吗?

    【讨论】:

    • 是的,你是对的,“Favorite Direct Dial”包含一些图像。那么,我们该如何解决这个问题呢?我认为一个小部件不应该导致启动器崩溃,但即使是股票启动器也没有做任何事情来处理异常......(事实上,如果我添加超过 2 个“Favorite Direct Dial”实例,它就会崩溃)。
    • 我相信由 Widget 实现者来阻止这种情况。 AppWidgetManager 提供了一些部分更新方法,看看那些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2011-05-14
    • 2011-11-22
    相关资源
    最近更新 更多