0

我正在尝试编写一个使用 com.loopj.android.http.AsyncHttpClient 的 Android 应用程序。虽然我几年前写了一个Android应用程序,但我很生疏,所以请对我温柔一点!

在我的应用程序中,我做了一个 get,并且没有调用任何回调虚拟方法。为了简化并确保它与我的应用程序无关,我基于 SDK 附带的 SupportAppNavigation 项目创建了一个新项目。我修改了 onCreate 代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Log.i("com.trumphurst", "Creating AsyncHttpClient");
    AsyncHttpClient client = new AsyncHttpClient();
    client.setTimeout(5000);
    Log.i("com.trumphurst", "Getting www.google.com");
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            Log.i("com.trumphurst", "Success");
        }
        @Override
        public void onFailure(Throwable error, String content) {
            Log.i("com.trumphurst", "Failure");
        }
    });
    setListAdapter(new SampleAdapter(querySampleActivities()));
}

(请注意,这是我对 SDK 附带的示例应用程序所做的唯一代码更改。)

我在调试器下启动了应用程序,并监控了 logcat 输出。我看到“创建 AsyncHttpClient”和“获取 www.google.com”,然后什么也没有。

我已向清单添加了一些权限 - 它现在开始:

<manifest android:versionCode="1"
    android:versionName="1"
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.support.appnavigation">

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application android:label="@string/app_name">
    <activity android:name=".app.AppNavHomeActivity"
            android:label="@string/app_nav_home_label">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

显然我一定做错了什么——谁能把我说得对?

4

3 回答 3

5

我认为您忘记了在 AndroidManifest 文件中添加权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在此处阅读有关清单文件的更多信息。

更新: 这是来自 loopj github 的清单文件示例

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.loopj.android.http"
    android:versionName="1.4.3"
    android:versionCode="1">
    <application
        android:name="android_async_http">
    </application>
    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.INTERNET" />
</manifest> 

您可以在此处查看 INTERNET 权限。

于 2013-06-18T11:01:35.790 回答
2

将 AsyncHttpResponseHandler() 更改为 TextHttpResponseHandler() 那么您的 Overrides 应该是:

myClient.get(url, new TextHttpResponseHandler() {

                    @Override
                    public void onFailure(int i, Header[] headers, String s, Throwable throwable) {

                     }

                    @Override
                    public void onSuccess(int ii, Header[] headers, String s) {

                    }

}
于 2015-01-17T20:01:05.307 回答
0

尝试将 onStart 和 onComplete 方法也添加到回调中。

AsyncHttpClient 的问题在于,如果您返回的 JSON 编码是否正确,它不会引发错误

例如,我遇到了和你一样的问题,但注意到 onSuccess 和 onComplete 方法都被调用了,但没有成功或失败。发现这是我的服务器返回 JSON 的方式。我试图返回一个关联的字符串数组,我创建了我自己并错过了数组名的 [] infont

问题:$result = array('result'=>'OK'); 解决方案: $result[] = array('result'=>'OK');

不是说你的会是同样的语法问题,但看看返回的内容不会有什么坏处

于 2013-10-13T04:36:17.810 回答