在 Android 中通过改造获取对象数组

Posted

技术标签:

【中文标题】在 Android 中通过改造获取对象数组【英文标题】:Obtain Array of Objects with retrofit in Android 【发布时间】:2018-09-23 01:45:03 【问题描述】:

我有一个服务器在我的本地主机中运行,数据库中有一些我想在我的 android 应用程序中显示的信息,我正在使用改造库来执行此操作,但我只收到以下消息:

从 API 加载错误

这是我的 RetrofitClient:

公共类 RetrofitClient

private static Retrofit retrofit = null;

public static Retrofit getClient(String baseUrl) 
    if (retrofit==null) 
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    
    return retrofit;

这是我的 GET 方法的类:

public interface SOService 

    @GET("stocks/")
Call<List<Stock>> getStocks();


这是我的课程,带有 url 以及如何连接:

public class ApiUtils 

    public static final String BASE_URL = "http://127.0.0.1:8000";

    public static SOService getSOService() 
        return RetrofitClient.getClient(BASE_URL).create(SOService.class);
    

这是我最终尝试获取信息的地方:

public class RegisterActivity extends AppCompatActivity 

    private Button registerButton;
    private SOService mService;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        mService = ApiUtils.getSOService();

        registerButton = findViewById(R.id.register_button);
        registerButton.setOnClickListener(v -> loadAnswers());
    

    public void loadAnswers() 

        System.out.println("Entro aquí");
        mService.getStocks().enqueue(new Callback<List<Stock>>() 
        @Override
        public void onResponse(Call<List<Stock>> call, Response<List<Stock>> response) 
            if(response.isSuccessful()) 

                System.out.println("Te lo imprimo");
                System.out.println(response.body().toString());
                Log.d("MainActivity", "posts loaded from API");
            else 
                int statusCode  = response.code();
                // handle request errors depending on status code
            
        

        @Override
        public void onFailure(Call<List<Stock>> call, Throwable t) 
            Log.d("MainActivity", "error loading from API");

        
    );
    

我有这样的股票类:

public class Stock 

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("ticker")
    @Expose
    private String ticker;
    @SerializedName("open")
    @Expose
    private Double open;
    @SerializedName("close")
    @Expose
    private Double close;
    @SerializedName("volume")
    @Expose
    private Integer volume;

    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public String getTicker() 
        return ticker;
    

    public void setTicker(String ticker) 
        this.ticker = ticker;
    

    public Double getOpen() 
        return open;
    

    public void setOpen(Double open) 
        this.open = open;
    

    public Double getClose() 
        return close;
    

    public void setClose(Double close) 
        this.close = close;
    

    public Integer getVolume() 
        return volume;
    

    public void setVolume(Integer volume) 
        this.volume = volume;
    


知道为什么它不起作用吗?

这是我得到的错误:

W/System.err: java.net.ConnectException: 无法连接到 /127.0.0.1:8000 在 okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:242) W / System.err:在 okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160) 在 okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257) 在 okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135) 在 okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114) 在 okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) W / System.err:在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) W / System.err:在 okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) 在 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) W / System.err:在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200) 在 okhttp3.RealCall$AsyncCall.execute(RealCall.java:147) 在 okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 在 java.lang.Thread.run(Thread.java:764) W/System.err:原因:java.net.ConnectException:连接失败 10000 毫秒后从 /127.0.0.1(端口 42532)到 /127.0.0.1(端口 8000): isConnected 失败:ECONNREFUSED(连接被拒绝) 在 libcore.io.IoBridge.isConnected(IoBridge.java:273) 在 libcore.io.IoBridge.connectErrno(IoBridge.java:188) 在 libcore.io.IoBridge.connect(IoBridge.java:130) 在 java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:129) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) W/System.err:在 java.net.Socket.connect(Socket.java:616) 在 okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:71) 在 okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240) ... 21 更多 引起:android.system.ErrnoException:isConnected 失败:ECONNREFUSED(连接被拒绝)W/System.err:在 libcore.io.IoBridge.isConnected(IoBridge.java:262) ... 31 更多

【问题讨论】:

在浏览器中粘贴该网址时是否收到相同的消息? 你可以 printstacktrace in t 找出问题所在 错误贴在上面的帖子上! 【参考方案1】:

您应该尝试检索这样的对象列表:

public interface SOService 

    @GET("stocks/")
    Call<List<Stock>> getStocks();



mService.getStocks().enqueue(new Callback<List<Stock>>() 
            @Override
            public void onResponse(Call<List<Stock>> call, Response<List<Stock>> response) 
                if(response.isSuccessful()) 

                    System.out.println("Te lo imprimo");
                    System.out.println(response.body().toString());
                    Log.d("MainActivity", "posts loaded from API");
                else 
                    int statusCode  = response.code();
                    // handle request errors depending on status code
                
            

            @Override
            public void onFailure(Call<List<Stock>> call, Throwable t) 
                Log.d("MainActivity", "error loading from API");

            
        );

编辑

您正在尝试通过模拟器连接到计算机上的本地服务器。模拟器无法连接到此服务器。检查此answer。您正在使用的本地 URL 将被改造用于在您的 PHONE(模拟器)上本地识别端口和地址。这就是你无法连接的原因。该地址中您的手机上没有服务器。你需要输入你的电脑IP地址才能工作:)

【讨论】:

谢谢,我编辑了,但还是有同样的问题 尝试添加 t.printStackTrace();在 onFailure 方法中查看出了什么问题。或者只是添加一个断点并检查“t” 错误发布,我认为我的服务器有问题 就是这样!感谢您的帮助。 很高兴我能帮上忙 :)

以上是关于在 Android 中通过改造获取对象数组的主要内容,如果未能解决你的问题,请参考以下文章

使用AngularJS方式在对象数组中通过其属性查找对象

在 laravel vue 中通过 axios post 发送对象数组

如何访问数组改造 2 / android studio 中的对象“播放器”

如何在 VUE 中通过 v-model 直接更新嵌套对象数组值?

什么是jquery对象数组

js中通过Object.prototype.toString方法----精确判断对象的类型