Android 在应用程序小部件更新中使用AsyncTask

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来完成这个

我正在开发我的第一个小部件,这是一个简单的启动倒计时小部件。它一直工作得很好,但我已经厌倦了每周更新日期和重新部署应用程序

我的目标是从web服务(JSON)中提取日期,并在updateAppWidget()中使用LocalDateTime()中返回的结果。例如:

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