Android项目中的retrofit.RetrofitError

Tim*_*kov 0 android retrofit

我是Retrofit的新手.尝试时,如果没有收到retrofit.RetrofitError和NetworkOnMainThreadException,则无法发出请求:

RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Url.BASE_URL)
            .build();

    Api api = restAdapter.create(Api.class);
        for(Url url : Url.values()) {
            Journal journal = api.getJournalInfo(url.getUrl());      //Here error
            System.out.println("journal : " + journal.getTitle());
        }
Run Code Online (Sandbox Code Playgroud)

这是班级期刊:

public class Journal {
private String title;
private String description;
private String image;

public String getTitle() {
    return title;
}
}
Run Code Online (Sandbox Code Playgroud)

类网址:

public enum Url {
ECONAMICS("economics.json"),
PHYSICS("mathematical.json"),
MATHEMATICAL("physics.json");

public static final String BASE_URL = "https://dl.dropboxusercontent.com/u/17192683/rest/journals/";

private String url;
Url(String url) {
    this.url = url;
}

public String getUrl() {
    return url;
}
}
Run Code Online (Sandbox Code Playgroud)

接口Api:

public interface Api {
@POST("/{url}")
public Journal getJournalInfo(@Path("url") String urlJournal);
}
Run Code Online (Sandbox Code Playgroud)

完全例外:

03-21 23:44:43.824  22782-22782/tim_kriuchkov.com.task E/AndroidRuntime? FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{tim_kriuchkov.com.task/tim_kriuchkov.com.task.MainActivity}: retrofit.RetrofitError
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
        at android.app.ActivityThread.access$600(ActivityThread.java:162)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5371)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: retrofit.RetrofitError
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
        at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
        at $Proxy0.getJournalInfo(Native Method)
        at tim_kriuchkov.com.task.MainActivity.onCreate(MainActivity.java:66)  // here error
        at android.app.Activity.performCreate(Activity.java:5122)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
Run Code Online (Sandbox Code Playgroud)

下一部分例外:

 Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
        at java.net.InetAddress.getAllByName(InetAddress.java:214)
        at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
        at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
        at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
        at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
        at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
        at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:469)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
        at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
        at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:505)
        at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
        at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
        at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
Run Code Online (Sandbox Code Playgroud)

最后一部分:

at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at $Proxy0.getJournalInfo(Native Method)
at tim_kriuchkov.com.task.MainActivity.onCreate(MainActivity.java:66)  // here error
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?我花了很多时间......

soc*_*qwe 6

不是在一个单独的线程中运行你的http调用,而是在android os禁止的主要android UI线程上运行(因此例外).

更改您的Api界面以使用Retrofits Callback.这将执行您的请求异步,并将在成功或出错时调用回调.

public interface Api {
   @POST("/{url}")
   public void getJournalInfo(@Path("url") String urlJournal, Callback<Journal> callback);
}
Run Code Online (Sandbox Code Playgroud)