好的,我认为这是一个反复出现的问题,对不起。我需要更新我的数据库从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
我的结论是:
我想办法解决这个问题。创建一个继承自activity和我处理方向问题的类,在其中安排我的广播以便在某个时间下载内容并显示对话框。所有其他类都继承自它。 我认为这个解决方案可行,但这是解决问题的重要方法。
很抱歉,如果我的问题太长了。我想讨论一些其他解决方案(如果我提出的是有效的解决方案,我没有测试过。)
答案 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