如何从网络侦听器服务调用widget的onUpdate函数

时间:2013-12-16 06:21:46

标签: android android-widget

我正在使用vogella教程为我的应用构建一个小部件。我有一个疑问。 每当用户第一次打开我的小部件时,我的代码将调用异步,它将从Web检索数据,并在postExecute中将更新数据显示到小部件中{工作正常} 在每个指定的更新间隔之后,将自动调用OnUpdate并再次调用异步并显示新数据。如果在更新时没有互联网可用,则使用之前的数据,并且小部件在这种情况下也是一致的。

但是如果在小部件启动时没有互联网连接[即。当第一次调用窗口小部件时],直到下一个更新间隔 [此窗口小部件中为30分钟]时,该会话才会显示任何数据

我添加了一个网络监听器,它运行正常。 但我无法从网络侦听器的onReceive()调用onUpdate函数。 如何强制调用窗口小部件的onUpdate函数,静态引用不会在此cade中工作。 请帮忙! {并抱歉这么大的文字问题}

>更新了网络侦听器类代码

public class NetworkListener extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    NetworkInfo mobNetInfo = connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (activeNetInfo != null || mobNetInfo != null) {
        if (!getUpdateComplete(context)) {
            Log.d("NetworkListener", "IsInterruptedDueToNetwork=true");
            RemoteViews remoteViews = new RemoteViews(
                    context.getPackageName(), R.layout.widget_layout);
            ComponentName watchWidget = new ComponentName(context,
                    MyWidgetProvider.class);
            (AppWidgetManager.getInstance(context)).updateAppWidget(
                    watchWidget, remoteViews);
        }

    } else {
        Toast.makeText(context, "Network Not Available", Toast.LENGTH_SHORT)
                .show();
    }
}

public boolean getUpdateComplete(Context mContext) {
    Log.d("getUpdateComplete", "getUpdateComplete");
    SharedPreferences myPref = mContext.getSharedPreferences("Widget",
            Context.MODE_PRIVATE);
    return myPref.getBoolean("IsUpdateComplete", false);
}

}

但是仍然没有使用上面的代码调用onUpdate方法。 我的代码在哪里错了!

2 个答案:

答案 0 :(得分:0)

如果您了解OOP概念,那么您不能直接调用任何受保护的方法..它只能派生但不能直接在任何地方调用它。

因此,在您的情况下,根据您为窗口小部件xml文件定义的时间间隔调用onUpdate()方法。最小间隔时间为30分钟(30 * 60 * 100毫秒)。

您可以在此处参考Android Developer Widget Tutorial ...

希望它会帮助你..

答案 1 :(得分:0)

您需要实现逻辑来更新窗口小部件类的onReceive中的窗口小部件,任何时候都可以调用它。

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.touchwidget);
    watchWidget = new ComponentName(context,
            widget.class);

            if (intent.getAction().equals(UPDATE_WIDGET)) {//user defined action
                //update widget
            }

    (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews);//it is responsible to update ur widget
}