0

わかりました、これは繰り返しの質問だと思います。申し訳ありません。Web からデータを収集して DB を更新し、データのダウンロード中にダイアログを表示する必要があります。私は自分のダイアログを持っています。データはうまくいき、データベースに書き込みます。私はいくつかの改善を行っています。今日、これは 1 つのアクティビティから機能します。私の意志は、これがすべてのアプリケーションで発生し、間隔を置いて開始することです。そして、これは問題が発生する瞬間です。AlertManager を使用してアクションのスケジュールを設定しています。データベースをチェックしてWebからデータを取得し始めるBroadcastReceiverがあります。この時点で、私は問題に直面しています。進行状況ダイアログが表示されず、データが完全に Web から取得されません。

BroadcastReceiver からのコード:

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;

public class SchedulerUpdate extends BroadcastReceiver {
    private Handler mHandler = null;

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            mHandler = new Handler();
            Log.i("INFO", "SCHEDULED");
            if(checkDataBase(context)){
                updateData(context);
            }
        }
        catch (Exception e) {       
            e.printStackTrace();
        }
    }

    private boolean checkDataBase(Context context){
        String path = "/data/data/"+context.getPackageName()+"/databases/mdsdacpdatabase.db";
        SQLiteDatabase database = null;

        boolean result = false;
        try{
            database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.CREATE_IF_NECESSARY);
            database.close();
            result = true;
        }
        catch(SQLiteException e){
        }

        return result;
    }

    private void updateData(final Context context) {
        ((Activity)context.getApplicationContext()).showDialog(ID_DIALOG_PROGRESS_DOWNLOAD);
        Runnable runnable = new Runnable(){
            public void run(){
                Log.i("INFO", "RUNNING");
                ...
                mHandler.post(new Runnable() {
                    public void run() {
                        ((Activity)context).dismissDialog(ID_DIALOG_PROGRESS_DOWNLOAD);
                        Log.i("INFO", "DONE");
                    }
                });
            };
        };
        new Thread(runnable).start();
    }
}

StackOverflow と Kam でこれらの投稿を読む:

Android でのブロードキャスト受信ダイアログの問題

BroadcastReceiver の AlertDialog

システムの再起動後にブロードキャスト レシーバーにアラート ダイアログを表示する

BroadcastReceiverからアンドロイドのアクティビティにデータを送信するには?

Android: サービスよりもアラームとインテント レシーバーを優先する<--Kam です

私の結論は次のとおりです。

  • BroadcastReceivers はアクティビティではないため (Commonsware が指摘しているように) ダイアログを表示できません。
  • BroadcastReceivers は、アプリをクラッシュさせる向きの問題を処理できません (onCreateDialog メソッドをオーバーライドするアクティビティでこれを修正します)。
  • ハンドラは、BroadcastReceivers で使用するように指定されていません。
  • サービスは、この種のタスクを実行するように指示されていません。

これを解決する方法を考えました。アクティビティから継承するクラスを作成し、オリエンテーションの問題を処理するクラスを作成し、ブロードキャストをスケジュールして、コンテンツをダウンロードし、ダイアログを表示します。そして、他のすべてのクラスはそれを継承します。この解決策は機能すると思いますが、問題を解決するための大きな回避策です。

私の質問が長すぎる場合は申し訳ありません。他のいくつかの解決策について話し合いたいと思います(私が提案したものが有効な解決策である場合、私はテストしていません)。

4

1 に答える 1

0

BroadcastReceiver オブジェクトは、onReceive(Context, Intent) への呼び出しの間のみ有効です。コードがこの関数から戻ると、システムはオブジェクトが終了し、アクティブではなくなったと見なします。

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

特に、ダイアログを表示したり、BroadcastReceiver 内からサービスにバインドしたりすることはできません。前者の場合は、代わりに NotificationManager API を使用する必要があります。後者の場合、 Context.startService() を使用してコマンドをサービスに送信できます。

ソース: http://developer.android.com/reference/android/content/BroadcastReceiver.html

于 2012-08-19T18:14:23.200 に答える