2012-02-06 39 views
2

我有我的第一個Android小工具有問題......我做這樣的:Android簡約小部件

public class TestwidActivity extends AppWidgetProvider { 

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

     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    // v1.5 fix that doesn't call onDelete Action 
     final String action = intent.getAction(); 
     if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
      final int appWidgetId = intent.getExtras().getInt(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
      if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
       this.onDeleted(context, new int[] { appWidgetId }); 
      } 
     } else { 
      super.onReceive(context, intent); 
     } 
    } 

    private class MyTime extends TimerTask { 
     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 
     java.text.DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM,Locale.getDefault()); 

     public MyTime(Context context, AppWidgetManager appWidgetManager) { 
      this.appWidgetManager = appWidgetManager; 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
      thisWidget = new ComponentName(context, TestwidActivity.class); 
     } 

     @Override 
     public void run() { 
      Bitmap bm; 
      remoteViews.setTextViewText(R.id.Clock, 
       "Time = " + format.format(new Date())); 
      bm= BitmapFactory.decodeFile("/sdcard/myFile.png"); 
      remoteViews.setImageViewBitmap(R.id.team11, bm); 
      appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
     } 
    } 
} 

但這停2秒後打印的時間。如果我只打印沒有圖像的時間,它的工作是完美的,但是這樣它不會爲什麼?

+0

它好像你正在創建太多的計時器 - 在你的計時器調用更新,並在更新您創建另一個定時器。 – ravyoli 2012-02-06 16:06:41

+0

以及我如何修改此工作? – 2012-02-07 07:56:02

+0

即時通訊不知道...也許重寫onEnabled – ravyoli 2012-02-07 15:56:35

回答

1

你不能在BroadcastReceiver中做異步的東西。 AppWidgetProvider是一個pimped BroadcastReceiver。 Android SDK在Rceiver生命週期部分提到了這一點:

「這對你在onReceive(Context,Intent)實現中可以做什麼有重要影響:任何需要異步操作的東西都不可用,因爲你需要從函數返回以處理異步操作,但此時BroadcastReceiver不再處於活動狀態,因此係統可以在異步操作完成之前自由地終止其進程。「

http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle