计划数据库更新并显示对话框

时间:2012-08-19 18:06:18

标签: android database android-intent dialog android-handler

好的,我认为这是一个反复出现的问题,对不起。我需要更新我的数据库从Web收集一些数据,并在下载数据时显示一个对话框。 我有我的对话框,数据很好并写入数据库。 我正在做一些改进。今天这个工作从一个活动开始。我的意愿是在所有应用程序中发生并在间隔后启动。这是问题出现的时刻。 我正在使用AlertManager来安排我的行动。我有一个BroadcastReceiver,检查我的数据库并开始从网上获取数据。此时我遇到了问题。我的进度对话框未显示,数据不完全来自网络。

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上阅读这些帖子:

BroadCast receiver dialog issue in Android

AlertDialog in BroadcastReceiver

show an alert dialog in broadcast receiver after a system reboot

How to send data from BroadcastReceiver to an Activity in android?

Android: Prefer Alarms and Intent Receivers to Services< - 这是Kam

我的结论是:

  • BroadcastReceivers无法显示对话框,因为它们不是 活动(如Commonsware指出);
  • BroadcastReceivers不能 处理崩溃应用程序的方向问题(我在我的活动中修复此问题 重写onCreateDialog方法);
  • 未指明处理程序 在BroadcastReceivers中;
  • 不表示服务是这样做的 任务;

我想办法解决这个问题。创建一个继承自activity和我处理方向问题的类,在其中安排我的广播以便在某个时间下载内容并显示对话框。所有其他类都继承自它。 我认为这个解决方案可行,但这是解决问题的重要方法。

很抱歉,如果我的问题太长了。我想讨论一些其他解决方案(如果我提出的是有效的解决方案,我没有测试过。)

1 个答案:

答案 0 :(得分:0)

  

BroadcastReceiver对象仅在通话期间有效   to onReceive(Context,Intent)。一旦你的代码从此返回   功能,系统认为要完成的对象不再   活性

     

这对你能做些什么有重要的影响   onReceive(Context,Intent)实现:需要的任何东西   异步操作不可用,因为您需要   从函数返回来处理异步操作,但是在   那一点,BroadcastReceiver不再是活动的,因此   系统可以在异步操作之前自由地终止其进程   完成。

     

特别是,您可能无法显示对话框或绑定到服务   在BroadcastReceiver中。对于前者,你应该使用   NotificationManager API。对于后者,你可以使用   Context.startService()将命令发送到服务。

来源:http://developer.android.com/reference/android/content/BroadcastReceiver.html