- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个向服务器发送数据的应用程序。我的 Activity 实现了 ResultReceiver.Receiver,因为它调用 IntentService,我在其中传递接收器,以便它可以将消息发送回我的 Activity 。我的 Activity 中有一个显示 progressDialog 的 onReceive 方法。它显示正确,但当服务完成并发回 FINISHED 消息时,progressDialog 不会关闭。
是否存在进度未取消的原因?
MyActivity extends Activity implements ResultReceiver.Receiver{
onCreate(){
mReceiver = new MyResultReceiver(new Handler());
mReceiver.setReceiver(this);
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
intent.putExtra("receiver", mReceiver);
intent.putExtra("command", "query");
intent.putExtra("compid", compID);
intent.putExtra("tagid", tagId);
intent.putExtra("tagclientid", tagClientId);
intent.putExtra("carerid", carerID);
intent.putExtra("formattedtagscantime", formattedTagScanTime);
intent.putExtra("formattednowtime", formattedNowTime);
intent.putExtra("statusforwebservice", statusForWbService);
intent.putExtra("devicename", getDeviceName() + getDeviceName());
intent.putExtra("taglatitude", tagLatitude);
intent.putExtra("taglongitude", tagLongitude);
startService(intent);
}
......
.....
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
final int RUNNING = 1;
final int FINISHED = 2;
final int ERROR = 3;
int buildVersionSdk = Build.VERSION.SDK_INT;
int buildVersionCodes = Build.VERSION_CODES.GINGERBREAD;
Log.e(TAG, "buildVersionSdk = " + buildVersionSdk
+ "buildVersionCodes = " + buildVersionCodes);
int themeVersion;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {
themeVersion = 2;
}else{
themeVersion = 1;
}
progressDialog = new ProgressDialog(NfcscannerActivity.this, themeVersion);
progressDialog.setTitle("Connecting to Server");
progressDialog.setMessage(" Sending data to server...");
progressDialog.setIndeterminate(true);
switch (resultCode) {
case RUNNING:
//show progress
Log.e(TAG, "queryService running");
try{
progressDialog.show();
}catch(Exception e){
//ignore
}
break;
case FINISHED:
progressDialog.dismiss();
String result = resultData.getString("result");
Log.e(TAG, "result in onreceive from posting service = " + result);
if( result != null && result.trim().equalsIgnoreCase("OK") ){
Log.e(TAG, "about to update DB with servertime");
DateTime sentToServerAt = new DateTime();
nfcscannerapplication.loginValidate.updateTransactionWithServerTime(sentToServerAt,null);
tagId = null;
tagType = null;
tagClientId = null;
//called to refresh the unsent transactions textview
onResume();
}else if(result != null && result.trim().equalsIgnoreCase("Error: TX duplicated")){
Log.e(TAG, "response from server is Duplicate Transaction ");
//NB. the following time may not correspond exactly with the time on the server
//because this TX has already been processed but the 'OK' never reached the phone,
//so we are just going to update the phone's DB with the DupTX time so the phone doesn't keep
//sending it.
DateTime sentToServerTimeWhenDupTX = new DateTime();
nfcscannerapplication.loginValidate.updateTransactionWithServerTime(sentToServerTimeWhenDupTX,null);
tagId = null;
tagType = null;
tagClientId = null;
}else{
Toast.makeText(NfcscannerActivity.this,
"No phone signal or server problem",
Toast.LENGTH_LONG).show();
}
break;
case ERROR:
// handle the error;
progressDialog.dismiss();
break;
}
}
}
.
public class QueryService extends IntentService {
final int STATUS_RUNNING = 1;
final int STATUS_FINISHED = 2;
final int STATUS_ERROR = 3;
private static final String TAG = QueryService.class.getSimpleName();
NfcScannerApplication nfcscannerapplication;
public QueryService() {
super("QueryService");
}
protected void onHandleIntent(Intent intent) {
Log.e(TAG, "inside onHandleIntent in QueryService");
nfcscannerapplication = (NfcScannerApplication)getApplication();
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
String command = intent.getStringExtra("command");
Bundle b = new Bundle();
if(command.equals("query")) {
receiver.send(STATUS_RUNNING, Bundle.EMPTY);
try {
// get some data or something
String compID = intent.getStringExtra("compid");
String tagID = intent.getStringExtra("tagid");
String tagClientID = intent.getStringExtra("tagclientid");
String carerID = intent.getStringExtra("carerid");
String formattedTagScanTime = intent.getStringExtra("formattedtagscantime");
String formattedNowTime = intent.getStringExtra("formattednowtime");
String statusForWebService = intent.getStringExtra("statusforwebservice");
String deviceName = intent.getStringExtra("devicename");
String tagLatitude = intent.getStringExtra("taglatitude");
String tagLongitude = intent.getStringExtra("taglongitude");
Log.e(TAG, "params in queryservice = " + compID + tagID + tagClientID + carerID + formattedTagScanTime +
formattedNowTime + statusForWebService + deviceName + tagLatitude + tagLongitude);
String result = nfcscannerapplication.loginWebservice.postData(compID, tagID, tagClientID, carerID, formattedTagScanTime,
formattedNowTime, statusForWebService, deviceName, tagLatitude, tagLongitude);
Log.e(TAG, "RESULT FROM POST IN QUERYSERVICE = " + result);
b.putString("result", result);
// b.putParcelableArrayList("results", results);
receiver.send(STATUS_FINISHED, b);
} catch(Exception e) {
b.putString(Intent.EXTRA_TEXT, e.toString());
receiver.send(STATUS_ERROR, b);
}
}
this.stopSelf();
}
}
最佳答案
您不能关闭进度对话框,因为每次您的应用进入 onReceive() 方法时都会创建一个新的进度对话框。
progressDialog = new ProgressDialog(NfcscannerActivity.this, themeVersion);
你看到了吗?您创建新的 ProgressDialog。并且您“丢失”了与之前对话的链接,因此无法将其关闭。将您的 progressDialog 声明为您的 Activity 字段。
例如,如果您根本不想更改代码(但我建议添加 UPLOAD_STARTED 大小写):
onCreate() {
...
startReceiving(intent);
progressDialog = new ProgressDialog()...
progressDialog.show()...
}
onReceive(){
...
case ERROR:
....
progressDialog.dismiss();
case FINISHED:
....
progressDialog.dismiss();
}
关于android - progressDialog 不在 onReceive 中关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790254/
是否可以让通知启动广播接收器? 我试过这段代码,但它不起作用。 通知已创建,但当我点击它时没有任何反应。 注意:当我将 notificationIntent 更改为从 MyBroadcastRecei
下面是我的 Java 代码和 XML 代码。有人可以告诉我为什么我的 onReceieve 方法永远不会被调用吗? Java: public class PopUPSMS extends Activi
onReceive 永远不会接到电话!我已经完成了这个工作,并且做了一些更改,现在我已经为此工作了 5 个小时,并且不知道当我向它发送短信时我的 onReceive 没有被调用! public voi
我正在尝试遵循这个例子: What is the correct way for sharing data among AppWidgetProvider and RemoteViewsService
我在 Activity 中创建了一个接收器,用于在连接互联网时自动调用网络服务。 代码如下 //Create receiver for while network will come auto cal
最近对Android开发很感兴趣, friend 给了我一本《Android应用开发傻瓜书》。在书中,有一个名为 Silent Toggle Mode 的示例应用程序。稍后它会教您为应用程序制作主屏幕
我在 mainfest.xml 中声明了我的 BroadcastReceiver 但从未调用过 onReceive() 方法。怎么了?我不想使用注册/注销方法。 Activity : Intent s
我有以下代码我想检测手机屏幕但是永远不会调用函数 onReceive谁能给我一个解决方案。请帮忙。如果有人有任何其他工作代码,请提供帮助。谢谢 package com.pack; import and
我创建了一个 broadcastreceiver 来 Hook 日历 EVENT_REMINDER 并获取有关事件的信息 public void onCreate(Bundle savedInstan
我读了这篇文章:Broadcast receiver onReceive() getting called multiple times 但我没有找到所需的答案。 我创建了一个小实用函数,它覆盖了 B
onReceive 方法中的线程在完成之前是否符合垃圾回收条件? @Override public void onReceive(final Context context, Intent inten
我正在使用此代码来检测屏幕何时被锁定并调用 toast,每次屏幕被锁定时它都会工作。但是,每当我离开应用程序时,它就会停止工作。它仅在应用程序打开时有效。 public class BatterySa
public class BroadcastTest extends Activity { BroadcastReceiver receiver; /** Called when the activi
我有一个从其他应用程序获取数据的服务。 当我得到日期时,我会向 broadCast 发送消息以刷新 UI。 多次调用onReceive方法,多次显示数据。 这是我的代码: DataService.ja
当我尝试接收的变量是@EnvironmentObject 的@Published 属性时,有什么方法可以防止在 View 最初加载时触发onReceive? 这是 View : struct Cont
我正在使用 Picker 来显示分段控件,并希望知道选择器值何时更改,以便我可以执行非 UI 操作。使用建议的 onReceive() 修饰符(如建议的 here )不起作用,因为每次渲染主体时都会调
我是 Android 初学者,遇到以下问题。我正在尝试从(不同的)应用程序 B 调用应用程序 A 注册的广播接收器。在应用程序 A 的广播接收器中,我实现了以下 onReceive() 方法,用于测试
我正在尝试开发一个短信应用程序。当我选择此应用程序作为默认短信应用程序并且当我收到带有此 SmsReceiver 代码的新短信时,会出现以下问题: 1) 每条新短信我都会收到 2 个 onReceiv
我正在设置一个内部BroadcastReceiver来获取 Activity 转换更新,例如步行、in_Vehicle。但 onReceive 方法永远不会被调用。 onCreate @Overri
我正在编写一个 Android 应用程序,它有一个受权限保护的广播接收器。广播接收器在接收来自经过身份验证的应用程序的请求时扫描硬编码 IP 地址的端口 80。它返回套接字连接尝试的结果。在我的代码中
我是一名优秀的程序员,十分优秀!