Java 改装-android.os.NetworkOnMainThreadException

Java 改装-android.os.NetworkOnMainThreadException,java,android,retrofit,retrofit2,Java,Android,Retrofit,Retrofit2,我使用改型2获取json并将其解析为POJO。我的目的是获取该对象的一个值 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' 我的REST客户: public interface MyClient { @GET("/part1/part2") Call<MyItem> getMyItem(

我使用改型2获取json并将其解析为POJO。我的目的是获取该对象的一个值

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
我的REST客户:

public interface MyClient {

    @GET("/part1/part2")
    Call<MyItem> getMyItem(@Query("param1") String param1,
                                                 @Query("param2") String param2,
                                                 @Query("param3") String param3);

}
公共接口MyClient{
@获取(“/part1/part2”)
调用getMyItem(@Query(“param1”)字符串param1,
@查询(“param2”)字符串param2,
@查询(“param3”)字符串param3);
}
我发现了创建服务的好工具:

public class ServiceGenerator {

    public static final String API_BASE_URL = "http://my.api.com";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
}
公共类服务生成器{
公共静态最终字符串API_BASE_URL=”http://my.api.com";
私有静态OkHttpClient.Builder httpClient=new OkHttpClient.Builder();
私人静态改装=
新的改型.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
公共静态S createService(类serviceClass){
改装改装=builder.client(httpClient.build()).build();
返回改装。创建(serviceClass);
}
}
然后,我使用服务生成器类创建新服务:

MyClient api = ServiceGenerator.createService(MyClient.class);
        Call<MyItem> call = api.getMyItem(param1, param2, param3);
        MyItem myItem= null;
        try {
            myItem= call.execute().body();
            Log.d("MyTag", myItem.getValue());
        } catch (IOException e) {
            e.printStackTrace();
        }
myclientapi=ServiceGenerator.createService(MyClient.class);
Call Call=api.getMyItem(param1、param2、param3);
MyItem MyItem=null;
试一试{
myItem=call.execute().body();
Log.d(“MyTag”,myItem.getValue());
}捕获(IOE异常){
e、 printStackTrace();
}
当我尝试运行此代码时,出现以下错误:

android.os.NetworkOnMainThreadException 在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 位于java.net.InetAddress.lookupHostByName(InetAddress.java:418) 位于java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 位于java.net.InetAddress.getAllByName(InetAddress.java:215) 位于okhttp3.Dns$1.lookup(Dns.java:39) 位于okhttp3.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:173) 在okhttp3.internal.http.RouteSelector.nextProxy(RouteSelector.java:139) 在okhttp3.internal.http.RouteSelector.next(RouteSelector.java:81) 位于okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174) 位于okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127) 位于okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) 位于okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289) 位于okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241) 在okhttp3.RealCall.getResponse(RealCall.java:240) 在okhttp3.RealCall$ApplicationInterceptorChain.procedure(RealCall.java:198) 在okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 在okhttp3.RealCall.execute(RealCall.java:57) 执行(OkHttpCall.java:177) 在2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute处(ExecutorCallAdapterFactory.java:87) 在uz.cp.ox.data.MyRepository.getMyItem(MyRepository.java:31)上 位于uz.cp.ox.presenters.MyPresenter.do(MyPresenter.java:30) 在uz.cp.ox.activities.MyActivity.onClick(MyActivity.java:52)中 在android.view.view.performClick上(view.java:4756) 在android.view.view$PerformClick.run(view.java:19749) 位于android.os.Handler.handleCallback(Handler.java:739) 位于android.os.Handler.dispatchMessage(Handler.java:95) 位于android.os.Looper.loop(Looper.java:135) 位于android.app.ActivityThread.main(ActivityThread.java:5221) 位于java.lang.reflect.Method.invoke(本机方法) 位于java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)上 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我认为改造会在后台线程中自动完成工作。或者我误解了什么。在这种情况下有什么问题,如何解决

我认为改造在后台会自动完成工作 线

<
MyClient api = ServiceGenerator.createService(MyClient.class);
Call<MyItem> call = api.getMyItem(param1, param2, param3);
call.enqueue(new Callback<MyItem>() {
    @Override
    public void onResponse(Call<MyItem> call, Response<MyItem> response) {
        MyItem myItem=response.body();
    }

    @Override
    public void onFailure(Call<MyItem> call, Throwable t) {
        //Handle failure
    }
});