Android 在应用程序小部件更新中使用AsyncTask
我正在开发我的第一个小部件,这是一个简单的启动倒计时小部件。它一直工作得很好,但我已经厌倦了每周更新日期和重新部署应用程序 我的目标是从web服务(JSON)中提取日期,并在updateAppWidget()中使用LocalDateTime()中返回的结果。例如:Android 在应用程序小部件更新中使用AsyncTask,android,android-widget,android-asynctask,Android,Android Widget,Android Asynctask,我正在开发我的第一个小部件,这是一个简单的启动倒计时小部件。它一直工作得很好,但我已经厌倦了每周更新日期和重新部署应用程序 我的目标是从web服务(JSON)中提取日期,并在updateAppWidget()中使用LocalDateTime()中返回的结果。例如: LocalDateTime ko = new LocalDateTime($yearJSON, $monthJSON, $dayJSON, 0, 0, 0, 0); 我只是不知道在哪里定义或者如何调用我的AsyncTask来完成这个
LocalDateTime ko = new LocalDateTime($yearJSON, $monthJSON, $dayJSON, 0, 0, 0, 0);
我只是不知道在哪里定义或者如何调用我的AsyncTask来完成这个任务。我有一个JSONParser类,我过去曾使用它从web中提取JSON数据,但我不知道如何将其实现到我的小部件中。我在下面发布了我的工作代码(没有异步任务),希望有人能帮助我。谢谢
public class Widget_Provider4_1 extends AppWidgetProvider {
// Custom Intent Name That Is Used By The AlarmManager To Update The Widget On The Top Of Every Hour.
public static String HKC_WIDGET_UPDATE = "xxxxxx.HKC_WIDGET_UPDATE";
// Custom Intent Name That Is Used To Show GBR Toast.
public static String HKC_WIDGET_CLICK = "xxxxxx.HKC_WIDGET_CLICK";
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (HKC_WIDGET_UPDATE.equals(intent.getAction())) {
// Get The Widget Manager And IDs For This Widget Provider, Then Call The Shared Timer Update Method.
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
// Update All Active Widgets
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for (int appWidgetID: ids) {
updateAppWidget(context, appWidgetManager, appWidgetID);
}
}
// If Logo Was Clicked Show Toast.
else if (HKC_WIDGET_CLICK.equals(intent.getAction())) {
Toast.makeText(context, "Go Team!", Toast.LENGTH_LONG).show();
}
}
private PendingIntent createClockTickIntent(Context context) {
// Define Intent To Update Widget
Intent intent = new Intent(HKC_WIDGET_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
// Disable AlarmManager
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(createClockTickIntent(context));
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
// Define AlarmManager
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
// Update On The Top Of Every Hour
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY)+1);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
alarmManager.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), 1000*60*60, createClockTickIntent(context));
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// Define Number Of Current Widgets
final int N = appWidgetIds.length;
// Loop Through Each Widget That Belongs To This Provider
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent To Launch WidgetActivity - In This Case It Just Shows Toast.
Intent intent = new Intent(HKC_WIDGET_CLICK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// Get Layout For Widget And Attach An On-Click Listener To The Icon
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout4_1);
views.setOnClickPendingIntent(R.id.logo, pendingIntent);
// Tell AppWidgetManager To Perform Intent On Current Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
// Update The Timer Using Shared Method
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
// Define Kickoff Time
LocalDateTime ko = new LocalDateTime(2013, 8, 31, 0, 0, 0, 0);
// Define Current Time
LocalDateTime date = new LocalDateTime();
// Zero Out Minutes, Seconds, And Milliseconds On Current Time - Fixes 11:00:xx PM Bug
LocalDateTime cur = new LocalDateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), date.getHourOfDay(), 0, 0, 0);
// Let Joda Date Make All Calculations
Period period = new Period(ko, cur, PeriodType.standard());
// Convert Times To Strings And Remove Dashes Used By Joda Time Format (ISO8601)
String s_months = Integer.toString(period.getMonths()).replace("-","");
String s_weeks = Integer.toString(period.getWeeks()).replace("-","");
String s_days = Integer.toString(period.getDays()).replace("-","");
String s_hours = Integer.toString(period.getHours()).replace("-","");
// Create Updated Time
String uTime = s_months+"mo "+s_weeks+"wks "+s_days+"d "+s_hours+"hrs";
// Convert Strings To Integers For Comparisons
int months = Integer.parseInt(s_months);
int weeks = Integer.parseInt(s_weeks);
int days = Integer.parseInt(s_days);
int hours = Integer.parseInt(s_hours);
// If Time Periods Are All <= 0 Then Show "Game Time!"
if(months <= 0 && weeks <= 0 && days <= 0 && hours <= 0){
uTime = "Game Time!!!";
}
// Update View
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout4_1);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
updateViews.setTextViewText(R.id.TimeLeft, uTime);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
}
公共类小部件提供程序4\u 1扩展了AppWidgetProvider{
//AlarmManager用于每小时更新窗口小部件的自定义意图名称。
公共静态字符串HKC_WIDGET_UPDATE=“xxxxxx.HKC_WIDGET_UPDATE”;
//用于显示GBR Toast的自定义意图名称。
公共静态字符串HKC_WIDGET_CLICK=“xxxxxx.HKC_WIDGET_CLICK”;
@凌驾
公共void onReceive(上下文、意图){
super.onReceive(上下文、意图);
if(HKC_WIDGET_UPDATE.equals(intent.getAction())){
//获取此小部件提供程序的小部件管理器和ID,然后调用共享计时器更新方法。
ComponentName thisAppWidget=新组件名(context.getPackageName(),getClass().getName());
AppWidgetManager AppWidgetManager=AppWidgetManager.getInstance(上下文);
//更新所有活动小部件
int-id[]=appWidgetManager.getAppWidgetIds(thisAppWidget);
for(int-appWidgetID:ids){
updateAppWidget(上下文、appWidgetManager、appWidgetID);
}
}
//如果点击了徽标,则显示Toast。
else if(HKC_WIDGET_CLICK.equals(intent.getAction())){
Toast.makeText(上下文“Go Team!”,Toast.LENGTH_LONG.show();
}
}
私有PendingEvent createClockTickIntent(上下文){
//定义更新小部件的意图
意向意向=新意向(HKC\U WIDGET\U更新);
PendingEvent PendingEvent=PendingEvent.getBroadcast(上下文,0,意图,PendingEvent.FLAG_UPDATE_CURRENT);
返回悬挂式帐篷;
}
@凌驾
已禁用公共无效(上下文){
super.onDisabled(上下文);
//禁用AlarmManager
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
alarmManager.cancel(createClockTickIntent(上下文));
}
@凌驾
公共void已启用(上下文){
super.onEnabled(上下文);
//定义AlarmManager
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
//每小时更新一次
Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR\u OF_DAY,cal.get(Calendar.HOUR\u OF_DAY)+1);
校准设置(日历分钟,0);
校准设置(日历秒,0);
校准设置(日历毫秒,0);
alarmManager.setRepeating(alarmManager.RTC,cal.getTimeInMillis(),1000*60*60,createClockTickIntent(上下文));
}
@凌驾
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
//定义当前窗口小部件的数量
final int N=appWidgetIds.length;
//循环浏览属于此提供程序的每个小部件
对于(int i=0;i