【问题标题】:Android AppWidget on orientation changed方向上的 Android AppWidget 已更改
【发布时间】:2014-12-13 10:39:55
【问题描述】:

我知道我的问题听起来很老,我确实在 SO 上进行了很多搜索,但无法弄清楚如何解决它。

我创建了一个带有刷新按钮的 App Widget,它允许用户从 Internet 加载信息。每当用户单击刷新时,小部件将执行 Asynctask 以下载信息。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    for (int appWidgetId: appWidgetIds) {
           //update app widget
    }
}

@Override
public void onReceive(Context context, Intent intent) {

    if (REFRESH_LIST.equals(intent.getAction())) {
          //Execute AsyncTask to download information from Internet and update widget listview
    }
}

小部件工作正常,除非用户在 AsyncTask 仍在后台运行时单击刷新并旋转屏幕,然后该小部件实例的整个小部件设置和数据都会丢失。

所以任何人都遇到过同样的问题,请给我一个手指。谢谢!!

【问题讨论】:

  • 玩了一会儿这个小部件,我发现只要RemoteViews不参与AsyncTask(我想在下载信息时显示一个ProgressBar),那么小部件和AsyncTask应该可以正常运行在方向改变了。希望这可以帮助遇到同样问题的人。

标签: android android-asynctask android-widget screen-orientation


【解决方案1】:

你不需要在那里使用AsynTask。 单击小部件上的 Refresh 按钮会将意图发送到您的服务。该服务将关心更新来自 Internet 的信息,以及何时完成任务关心更新小部件(再次通过意图)。这样,方向的改变不会破坏您的服务任务。

假设:
我想,您当前的实现将无法处理方向更改。因为系统系统在此过程中简单地重新创建了新的 Widget。在这种情况下,AsyncTask 任务仍在运行,并将在旧小部件(留在内存中)处完成,但不适用于新小部件。

【讨论】:

  • 感谢您的回复。事实上,我确实尝试将互联网信息更新代码放在 onReceive() 中,但最终出现 Exception java.lang.RuntimeException: android.os.NetworkOnMainThreadException
【解决方案2】:

在玩了这个小部件一段时间后,我发现只要 RemoteViews 不参与 AsyncTask(我想在下载信息时显示一个 ProgressBar),那么小部件和 AsyncTask 在方向改变时应该可以正常运行。希望这可以帮助遇到同样问题的人。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2011-10-29
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多