android - 调试Widget导致ANR

标签 android eclipse android-widget

我正在尝试调试一个 AppWidget,但遇到了一个问题 :D 如果不设置断点,小部件将在没有 ANR 的情况下工作,并且命令 Log.v 可以完美执行。 然后我在方法的顶部放置了一个断点:

    public void onReceive(Context context, Intent intent) {
    Log.v(TAG, "onReceive 1"); // BP on this line
    super.onReceive(context, intent);
    String action = intent.getAction();

    // Checks on action and computations ...

    Log.v(TAG, "onReceive 2");
    updateWidget(context);
    Log.v(TAG, "onReceive 3");
}

断点按预期停止执行,但随后进程终止。 问题是断点(我猜是 xD)导致 ANR 并且 ActivityManager 终止了进程。那是日志:

01-07 14:32:38.886: ERROR/ActivityManager(72): ANR in com.salvo.wifiwidget
01-07 14:32:38.886: INFO/Process(72): Sending signal. PID: 475 SIG: 9
......
......
01-07 14:32:38.906: INFO/ActivityManager(72): Process com.salvo.wifiwidget (pid   475) has died.

这会导致调试停止。 所以问题是:有一种方法可以在不引起 ANR 的情况下调试小部件吗? 预先感谢您的回答

最佳答案

你是对的。根据this如果处理其 onReceive 方法的时间超过 10 秒,您的 Widget 的 BroadcastReceiver 将被系统杀死。

在我的脑海中,我可以看到两个解决方案:

  1. 将逻辑与表示分离并在 Activity 中调试您的逻辑,然后将其合并到小部件中。
  2. 求助于“老好”伐木。

或者您可以尝试以下操作。我不确定它是如何工作的,但也许值得尝试一下这种方法。

使用您自己的 Activity 作为小部件 RemoteViews 的宿主。我做过这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
            android:id="@+id/widget_view"
            android:layout_width="fill_parent"
            android:layout_height="200dp"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Inflate widget"
        android:onClick="onInflateClick"/>
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Update widget"
            android:onClick="onUpdateClick"/>
</LinearLayout>

在此布局中,带有 id = widget_view 的 LinearLayout 将充当小部件宿主。 Activity 代码本身如下所示:

package com.example;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RemoteViews;

public class MyActivity extends Activity {
    private LinearLayout widgetHolder;
    private View widgetView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        widgetHolder = (LinearLayout) findViewById(R.id.widget_view);
    }

    public void onInflateClick(View v) {
        RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget);
        views.setImageViewResource(R.id.image, R.drawable.img1);
        views.setTextViewText(R.id.text, "Widget created");
        widgetView = views.apply(this, null);
        widgetHolder.addView(widgetView);
    }

    public void onUpdateClick(View v) {
        onUpdateWidget(0);
    }

    public void onUpdateWidget(int widgetId) {
        RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget);
        views.setImageViewResource(R.id.image, R.drawable.img2);
        views.setTextViewText(R.id.text, "Widget updated");

        // Tell the AppWidgetManager to perform an update on the current app widget
        updateWidget(widgetId, views);
    }

    private void updateWidget(int widgetId, RemoteViews views) {
        views.reapply(this, widgetView);
        // appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

将您的小部件更新逻辑放入 updateWidget 方法(或仅使用假参数调用小部件的 BroadcastReceiver 的正确 onUpdate 方法),您可以通过单击 Activity 上的按钮对其进行调试。

同样,我从未在真正的小部件上尝试过,我只是想出一个主意并尝试为其编写代码。使用它需要您自担风险:)

我把我的快速而肮脏的项目放到了github如果您想尝试一下。它是一个 Idea 项目,但将它导入 Eclipse 应该很容易。

关于android - 调试Widget导致ANR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4626103/

相关文章:

android - 如何在Dart/Flutter中将主体添加到GET请求?

eclipse - 当我在 eclipse 中运行时,Tomcat 出现问题

android计算恒定日期和现在之间的差异

Android - 点击淡入淡出图像按钮

Android 上下文菜单不再出现在模拟器中

android - 在运行时管理表格行的 View

android - 仅当设备开启且小部件在主屏幕上可见时才更新小部件

java - Android 自定义 View - java.lang.RuntimeException android.view.InflateException

java - 创建具有大量选项的位掩码

java - 无法在 Eclipse 中创建 Android 应用程序项目。错误消息 - 输入应用程序名称(显示在启动器中)