Android Freebase 查询 IOException

Posted

技术标签:

【中文标题】Android Freebase 查询 IOException【英文标题】:Android Freebase Query IOException 【发布时间】:2013-02-04 18:26:16 【问题描述】:

我正在尝试在 android Eclipse 中进行简单的 Freebase 查询。我相信 URL 编译正确,因为我可以复制/粘贴编码的 URL,将其复制/粘贴到浏览器中,它会提取正确的结果。 HttpResponse httpResponse = httpClient.execute... 行正在引发 IOException。

JSONParser parser = new JSONParser();
String query = "\"type\":\"/user/tsegaran/language/phrase\",\"id\":null,\"name\":\"Affidavit\",\"/user/tsegaran/language/phrase/translation\":[]";
String testQuery = URLEncoder.encode(query, "UTF-8");
String testQuery1 = "https://www.googleapis.com/freebase/v1/mqlread?query=" + testQuery + "&key=" + API_KEY;
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(new HttpGet(testQuery1));
JSONObject response = (JSONObject)parser.parse(EntityUtils.toString(httpResponse.getEntity()));
String jsonResults =  response.getString("result");
JSONObject object = (JSONObject) new JSONTokener(jsonResults).nextValue();
String name = object.getString("/user/tsegaran/language/phrase/translation");
...

这是我的 Stack Trace 格式更好的版本:

java.net.UnknownHostException: www.googleapis.com
java.net.InetAddress.lookupHostByName(InetAddress.java:506)
java.net.InetAddress.getAllByNameImpl(InetAddress.java:294)
java.net.InetAddress.getAllByName(InetAddress.java:256)
 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
com.example.nworthen_androidpoc.MainActivity.test(MainActivity.java:60)
com.example.nworthen_androidpoc.MainActivity.onCreate(MainActivity.java:32)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
android.app.ActivityThread.access$1500(ActivityThread.java:117)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:130)
android.app.ActivityThread.main(ActivityThread.java:3683)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
dalvik.system.NativeStart.main(Native Method)

我的异常不一致(NullPointer、IOException、NetworkonMainThread)。我将发布的代码添加到 AsyncTask。不幸的是,我的 Logcat 不再有输出,但是在调试时它让我: 类文件编辑器

找不到来源 JAR 文件 C:/users..... 没有源附件。可以附上源码... // 编译自 ThreadPoolExecutor.java (version 1.5 : 49.0, super bit)

public class java.util.concurrent.ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService 

  // Method descriptor #17 (IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;)V
  // Signature: (IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue<Ljava/lang/Runnable;>;)V
  // Stack: 3, Locals: 7
  public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, java.util.concurrent.TimeUnit unit, java.util.concurrent.BlockingQueue workQueue);
     0  aload_0 [this]
     1  invokespecial java.util.concurrent.AbstractExecutorService() [1]
     4  new java.lang.RuntimeException [2]
     7  dup

...

【问题讨论】:

抛出的 IOException 的堆栈跟踪将帮助人们诊断这个问题。 这似乎变成了关于如何使用 AsyncTasks 的单独问题。从上面发布的代码中查询 Freebase 时,您是否仍然收到 IOExceptions?如果您现在从调用 AsyncTask 中得到 NullPointerExceptions,您应该将其作为一个单独的问题重新发布,并附上相关代码和堆栈跟踪。 【参考方案1】:

您是否确保您的应用有权访问互联网?

见:https://***.com/a/442590/81821

【讨论】:

肖,谢谢你的建议。我相信它推动了我前进。我已经从 IOException 发展到:java.lang.ClassCastException: org.json.simple.JSONObject

以上是关于Android Freebase 查询 IOException的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定主题提取 Freebase 数据转储

Freebase:啥数据转储文件包含“imdb_id”?

使用 MapReduce 解析 Freebase RDF 转储

Freebase 实体在 Google 知识图中的实体排名

Google Freebase 搜索 API 替代方案?

怎么把freebase.nt导入virtuoso