2012-02-06 12 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

+0

、これを変更するにはどうすればよいですか? –

+0

よくわからない...代わりにonEnabledをオーバーライドする – ravyoli

答えて

1

BroadcastReceiverで非同期の処理を行うことはできません。 AppWidgetProviderはpimped BroadcastReceiverです。 Android SDKはRceiverライフサイクルのセクションでこれを記述しています:

"これは、onReceive(Context、Intent)実装でできることに重要な影響を与えます:非同期操作が必要なものはありません。非同期操作を処理する関数から戻りますが、その時点でBroadcastReceiverはアクティブでなくなり、システムは非同期操作が完了する前にプロセスを強制終了します。

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

関連する問題