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秒後に印刷が中止されます。私はイメージなしで時間を印刷するだけで完璧に動作しますが、このようにはありません。なぜですか?

2
あまりにも多くのタイマーを作成しているかのように思えます。タイマーでは更新を呼び出し、更新では別のタイマーを作成します。
追加された 著者 ravyoli,
私はよくわからない...代わりにonEnabledをオーバーライドする
追加された 著者 ravyoli,
これを変更するにはどうすればよいですか?
追加された 著者 Harsan Valentin,

1 答え

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

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

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

1
追加された