使用retrofit在Android中获取对象数组

26 浏览
0 Comments

使用retrofit在Android中获取对象数组

我在本地主机上运行了一个服务器,其中包含一些数据库中的信息,我想在我的Android应用程序中显示这些信息。我正在使用Retrofit库来实现,但我只得到了以下消息:\n

\n从API加载错误\n

\n以下是我的RetrofitClient:\npublic class RetrofitClient {\n

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;
}

\n}\n这是带有我的GET方法的类:\n

public interface SOService {
    @GET("stocks/")
Call> getStocks();
}

\n这是我的URL和连接方式的类:\n

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);
    }
}

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

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>() {
        @Override
        public void onResponse(Call> call, Response> 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> call, Throwable t) {
            Log.d("MainActivity", "error loading from API");
        }
    });
    }
}

\n我有一个这样的Stock类:\n

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;
    }
}

\n有人知道为什么它不起作用吗?\n这是我收到的错误:\n

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

0
0 Comments

问题的原因是尝试通过模拟器连接到本地计算机上的服务器,但模拟器无法连接到该服务器。解决方法是使用计算机的IP地址。

在Android中使用Retrofit获取对象数组的方法如下:

首先,创建一个接口`SOService`,其中定义了一个`getStocks()`方法,返回一个`Call>`对象。

然后,在调用`getStocks()`方法时,使用`enqueue()`方法添加一个回调函数,该回调函数在请求成功时被调用。在回调函数中,通过`response.isSuccessful()`判断请求是否成功,如果成功,则通过`response.body()`获取响应体,并进行相应的处理;如果失败,则通过`response.code()`获取状态码,并根据状态码进行相应的错误处理。

如果请求失败,在回调函数的`onFailure()`方法中处理请求失败的情况。

此外,还可以在`onFailure()`方法中添加`t.printStackTrace()`语句来查看错误的详细信息,或者在代码中添加断点来调试问题。

根据问题的描述,问题可能是由于连接的服务器有问题导致的。可以通过打印错误信息或者添加断点来进一步调试和定位问题。

最后,感谢帮助解决问题的人。

0