服务器调用永远挂起,仅在android * built * app上

时间:2015-02-10 09:22:36

标签: android cordova meteor

我的应用效果很好:

  • 在浏览器上,本地和部署
  • 在模拟器上,使用本地或部署的服务器
  • 使用run android-device时,使用本地或部署的服务器
  • 在我的设备上

但不知何故,当我在these instructions之后构建它时,在第一次服务器调用时,例如:

console.log("test1");
Meteor.call("someMethod", function (error, result) {
  console.log("test2");
});
// yes I know how asynchronous calls work
console.log("test3");

或者:

console.log("test1");
Meteor.loginWithPassword("validUsername", "validPassword", function (error, result) {
  // should print no matter if the credentials are good or bad anyway
  console.log("test2");
});
console.log("test3");

" TEST2"不会在adb logcat中打印出来,即使" test1"和" test3"做。有一个地图框地图加载正常,所以它不是一个互联网访问问题。此外,启动工作:

Meteor.startup(function () {
  console.log("this gets printed in the adb console");
});

所以它不是所有流星方法。我使用了部署和本地服务器:服务器日志中没有报告错误。我还在我的本地服务器上测试了热代码推送,它会在我的手机上重新加载应用程序!但只是在我刚刚安装完应用程序后才第一次启动应用程序。不过,他们之间至少存在某种联系。

我还应该提一下,我已经构建了这个应用程序,之前它运行良好,但我没有在一段时间内构建它,现在它不再工作了。我在两个不同的设备上安装了软件包并得到了完全相同的问题。

以下是我的包裹清单,如果可以提供帮助,全部是最新版本:

meteor-platform
iron:router
sacha:spin
accounts-password
accounts-base
mdg:geolocation
mrt:flash-messages
mdg:camera
useraccounts:ratchet
fastclick
alanning:roles
tap:i18n
simple:imgur

以下是我在本地服务器上启动客户端时的日志:

I/CordovaLog(18991): Changing log level to DEBUG(3)
I/CordovaLog(18991): Found start page location: index.html
D/CordovaLog(18991): file:///android_asset/www/meteor_cordova_loader.js: Line 12 : METEOR CORDOVA DEBUG (meteor_cordova_loader.js) Error reading version file Error: Failed to resolve entry: file:///data/data/com.idz9099616fhad1150nrz/files/meteor/version
D/CordovaLog(18991): file:///android_asset/www/meteor_cordova_loader.js: Line 12 : METEOR CORDOVA DEBUG (meteor_cordova_loader.js) Couldn't load from the manifest, falling back to the bundled assets.
D/CordovaLog(18991): file:///android_asset/www/meteor_cordova_loader.js: Line 12 : METEOR CORDOVA DEBUG (meteor_cordova_loader.js) Loading from url: http://meteor.local
D/CordovaLog(18991): http://meteor.local/d7372e9a56ce9d5ddfb0fea0d5e071cfd699fac8.js: Line 111 : show showSignInLink signIn

这些都是在我点击之前#34;登录"在我的应用程序上最后一个语句只是来自useraccounts:ratchet包的日志打印。只要我点击"登录":空白页面,并在日志上输出零。 (这是因为我实际上永远无法停止登录,如前所述)上面的日志仍然是永远的。

使用与run android-device一起安装的应用时,它的输出完全相同,只是在我点击后,下一页显示,一切正常。 (日志工作,就像其他一切一样)与非功能应用程序一样,不再显示日志行。 (除非我像往常一样开始使用应用程序)

真正让我感到困惑的是,当我使用run android-device安装应用时,它在我的手机上运行得非常好。即使我停止调试并将此版本作为独立应用程序使用,它也能完美运行!但我无法让用户使用meteor run来安装我的应用,是吗?

1 个答案:

答案 0 :(得分:0)

根据您提供的信息,您的代码中似乎存在竞争条件问题。我不确定这是什么,但你所描述的问题的特征使它很有可能。

在本地服务器上它没有弹出,因为连接是相当即时的,但在远程服务器上它更是一个问题,因为由于更高的延迟,数据可能还没有准备好。

基本上,您的代码中有喜欢这样的东西,或者某种方式的变体:

var doc = MyCollection.findOne();
return doc.name

事情是MyCollection.findOne()null(因为数据尚未加载)。这会调出cannot read 'name' of undefined错误(客户端而不是服务器端),这会停止执行更多代码,这就是为什么您的屏幕是白屏并且订阅没有运行。

如何找到确切的位置。尝试访问adb以查看设备上的客户端日志或查看并使用xxx.meteor.com /您在Web浏览器上部署的服务器登录,并密切关注JS控制台以查找其弹出的位置起来。 重现此问题的关键是与服务器的连接速度比本地主机上的速度慢

该修复仅仅是因为缺少数据,即return doc && doc.name而不是return doc.nameif(doc != null) return doc.name;