我正在使用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方法。 我的代码在哪里错了!
答案 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
}