好的,我认为这是一个反复出现的问题,对此感到抱歉。我需要更新我的数据库,从网络收集一些数据并在下载数据时显示一个对话框。我有我的对话,数据很好并写入数据库。我正在做一些改进。今天,这从一个活动开始。我的意愿是这发生在所有应用程序中,并在一段时间后开始。这就是问题出现的时刻。我正在使用 AlertManager 来安排我的行动。我有一个 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 上的这些帖子:
BroadcastReceiver 中的 AlertDialog
如何将数据从 BroadcastReceiver 发送到 android 中的 Activity?
Android:更喜欢警报和意图接收器而不是服务<--这是 Kam
我的结论是:
- BroadcastReceivers 无法显示对话框,因为它们不是活动(如 Commonsware 指出的);
- BroadcastReceivers 无法处理导致应用程序崩溃的方向问题(我在覆盖 onCreateDialog 方法的活动中解决了这个问题);
- 处理程序未指示在广播接收器中使用;
- 服务未指示执行此类任务;
我想了一个办法来解决这个问题。创建一个继承自活动的类,并在其中处理方向问题,在其中安排我的广播以在某个时间下载内容并显示对话框。所有其他类都继承自它。我认为这个解决方案有效,但它是解决问题的重要解决方法。
对不起,如果我的问题太长了。我想讨论一些其他的解决方案(如果我提出的是一个有效的解决方案,我没有测试)。