Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 计划数据库更新并显示对话框_Android_Database_Android Intent_Dialog_Android Handler - Fatal编程技术网

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

Android 计划数据库更新并显示对话框,android,database,android-intent,dialog,android-handler,Android,Database,Android Intent,Dialog,Android Handler,好的,我想这是一个反复出现的问题,很抱歉。我需要更新我的数据库,从网上收集一些数据,并在下载数据时显示一个对话框。 我有我的对话框,数据很好,并写入数据库。 我正在做一些改进。今天,这项工作从一项活动开始。我的意愿是,所有应用程序都会发生这种情况,并在一段时间后启动。这是问题出现的时刻。 我正在使用AlertManager计划我的操作。我有一个广播接收器,它检查我的数据库并开始从网络上获取数据。在这一点上,我面临着问题。“我的进度”对话框未显示,数据也不完全来自web 来自广播接收器的代码: i

好的,我想这是一个反复出现的问题,很抱歉。我需要更新我的数据库,从网上收集一些数据,并在下载数据时显示一个对话框。 我有我的对话框,数据很好,并写入数据库。 我正在做一些改进。今天,这项工作从一项活动开始。我的意愿是,所有应用程序都会发生这种情况,并在一段时间后启动。这是问题出现的时刻。 我正在使用AlertManager计划我的操作。我有一个广播接收器,它检查我的数据库并开始从网络上获取数据。在这一点上,我面临着问题。“我的进度”对话框未显示,数据也不完全来自web

来自广播接收器的代码:

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

BroadcastReceiver对象仅在调用期间有效 接收(上下文、意图)。一旦你的代码从这里返回 功能,系统认为对象已完成,不再 活跃的

这对你在工作中能做什么有着重要的影响 onReceive(上下文、意图)实现:任何需要 异步操作不可用,因为您需要 从函数返回以处理异步操作,但在 此时广播接收器不再处于活动状态,因此 系统可以在异步操作之前终止其进程 完成

特别是,您可能不会显示对话框或绑定到来自的服务 在广播接收机中。对于前者,您应该使用 NotificationManager API。对于后者,您可以使用 Context.startService()向服务发送命令


来源:

谢谢你的回复。如果我的用户点击通知栏,这个问题就解决了。我的想法是计划意图,并在时间用完时触发它。在这种情况下,代码将仅在用户单击时运行,这不是所需的功能。