使用retrofit在Android中获取对象数组
使用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
问题的原因是尝试通过模拟器连接到本地计算机上的服务器,但模拟器无法连接到该服务器。解决方法是使用计算机的IP地址。
在Android中使用Retrofit获取对象数组的方法如下:
首先,创建一个接口`SOService`,其中定义了一个`getStocks()`方法,返回一个`Call>`对象。
然后,在调用`getStocks()`方法时,使用`enqueue()`方法添加一个回调函数,该回调函数在请求成功时被调用。在回调函数中,通过`response.isSuccessful()`判断请求是否成功,如果成功,则通过`response.body()`获取响应体,并进行相应的处理;如果失败,则通过`response.code()`获取状态码,并根据状态码进行相应的错误处理。
如果请求失败,在回调函数的`onFailure()`方法中处理请求失败的情况。
此外,还可以在`onFailure()`方法中添加`t.printStackTrace()`语句来查看错误的详细信息,或者在代码中添加断点来调试问题。
根据问题的描述,问题可能是由于连接的服务器有问题导致的。可以通过打印错误信息或者添加断点来进一步调试和定位问题。
最后,感谢帮助解决问题的人。