我正在编写我的第一个使用Azure移动服务平台的应用程序。我配置了一个SQL服务器,该表显示在Azure管理门户上。我已经手动向表中添加了一些条目,以确保服务器端没有任何错误。
我的问题在于,当我在桌面上执行查询时,我的应用程序挂起。这是我的代码:
public MUManager(Context con){
context = con;
try {
Log.i("Counter", "Before mClient");
mClient = new MobileServiceClient("https://blah.com","apikey",context);
Log.i("Counter", "After mClient");
muTable = mClient.getTable("table1",MUItem.class);
} catch (MalformedURLException e) {
Log.i("Counter", "MalformedURL");
e.printStackTrace();
}
Log.i("Counter", "End of constructor");
}
现在,我对上述代码没有任何问题,但我也无法确认客户端是否实际连接到Azure移动服务。
以下是导致我的问题的代码。
public ArrayList<MU> getMUList() throws ExecutionException, InterruptedException {
Log.i("Counter", "Start SQL");
MobileServiceList<MUItem> resultList = muTable.where().field("fieldname").eq("fieldvalue").execute().get();
Log.i("Counter", "SQL success!");
ArrayList<MU> MUList = new ArrayList<>();
Log.i("Counter", "MU Initialization successful!");
for(MUItem m:resultList){
Log.i("Counter", m.Name);
MUList.add(getMUfromItem(m));
}
return MUList;
}
当我到达该行时,上面的代码会冻结:
MobileServiceList<MUItem> resultList = muTable.where().field("fieldname").eq("fieldvalue").execute().get();
我没有收到任何错误,但我从未看到我的SQL成功!语句出现在日志中,应用程序冻结,好像有一个IO块或其他东西。
我认为我拥有所有必要的Gradle依赖项,它们是:
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.microsoft.azure:azure-mobile-services-android-sdk:2.0.2-beta'
compile 'com.google.android.gms:play-services:6.5.87'
compile 'com.android.support:support-v4:21.0.3'
compile 'com.google.code.gson:gson:2.2.2'
compile 'com.google.guava:guava:18.0'
非常困惑,提前谢谢!
编辑: 我刚玩了一个游戏,发现它的get()函数导致代码挂起。我不知道为什么,但即使在插入命令上发出命令,它似乎也会导致挂起。我正在阅读为什么get()会导致挂起,但我却在努力寻找有价值的东西
编辑2: 所以我只是连接了我的手机,一个物理的Android设备,看看是否会在物理上发生同样的错误,就像它在模拟器中一样。我现在得到一个稍微冗长的输出,而不是我刚收到的app:
getaddrinfo+,hn 30(0x736565722d696e),sn(),family 0,flags 4
getaddrinfo-,err=8
getaddrinfo+,hn 30(0x736565722d696e),sn(),family 0,flags 1024
getaddrinfo-, 1
getaddrinfo_proxy+
getaddrinfo_proxy-,TEMP_FAILURE_RETRY
然后它继续挂起。这意味着什么?
答案 0 :(得分:1)
我找到了解决这个问题的方法,实际上有点尴尬! 问题是我的权限条款要求Internet访问是在子句内!