Java Android…使用Okhttp无法从黑暗天气API获取JSON响应

Java Android…使用Okhttp无法从黑暗天气API获取JSON响应,java,android,api,android-studio,okhttp3,Java,Android,Api,Android Studio,Okhttp3,我正在编写代码来使用API构建一个简单的天气应用程序 下面是我的java代码文件。 其中,我使用okHttp 3.5.0,异步调用darksky API并在日志上写入响应 MainActivity.java package treehouse.com.stormy; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.

我正在编写代码来使用API构建一个简单的天气应用程序 下面是我的java代码文件。 其中,我使用okHttp 3.5.0,异步调用darksky API并在日志上写入响应

MainActivity.java

package treehouse.com.stormy;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;

import javax.xml.datatype.Duration;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    public static final String TAG=MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        double latitude=37.8267;
        double longitude=-122.4233;
        String apiKey="Here you would insert your key and I have ofcourse mine";
        String forecastURL="https://api.darksky.net/forecast/" + apiKey + "/" + latitude + "," + longitude;

      OkHttpClient client=new OkHttpClient();
        Request request=new Request.Builder().url(forecastURL).build();
        Call call=client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                try {
                    if(response.isSuccessful()) {
                        Log.v(TAG, response.body().string());
                    }
                } catch (IOException e) {

                    Log.e(TAG,"Exception caught: ",e);
                }
            }
        });


    }
}
活动输出

Gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "treehouse.com.stormy"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.squareup.okio:okio:1.6.0'
    compile project(':okhttp-3.5.0')
}
repositories {
    mavenCentral()

}
详细日志目录

**我的活动在模拟器上崩溃,但它正确地调用了API,我在运行代码之前和之后检查了API控制台的使用情况

在运行代码之前使用API

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "treehouse.com.stormy"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.squareup.okio:okio:1.6.0'
    compile project(':okhttp-3.5.0')
}
repositories {
    mavenCentral()

}

运行代码后的API使用情况

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "treehouse.com.stormy"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.squareup.okio:okio:1.6.0'
    compile project(':okhttp-3.5.0')
}
repositories {
    mavenCentral()

}

您使用的是旧版本的Okio库,该库与您的OkHttp版本不兼容,在尝试调用不存在的方法时导致崩溃。我建议使用最新版本的Okio,但是OKHTTPMaven库也已经有了依赖关系


只需从gradle文件中删除
编译'com.squareup.okio:okio:1.6.0'
行。

API请求和响应对我来说运行良好(在更新API密钥之后)。问题一定是别的。我的请求和响应现在也运行良好,问题是因为我支持代理,所以我需要为android emulator设置提供代理,以使其使用Internet。因此,现在正如您(在我的API使用图表上)所看到的,我正确地调用了API,但现在我的活动正在崩溃。很高兴了解它的工作情况。尝试查看日志中的内容。如果这是另一个无法解决的问题,请考虑打开一张新的票。你检查错误了吗?放上你的stacktrace.FYI,我已经用了几年了,这很好,至少是出于我的目的。我试过了,但在删除这行代码后,你暗示代码甚至没有调用API。我没有注意到你将OkHttp作为本地模块(为什么??)。将gradle文件中的OkHttp依赖项替换为“compile'com.squareup.okhttp3:OkHttp:3.5.0”。如果它不起作用,您可以尝试添加回Okio依赖项,但使用最新版本(1.11.0)