【问题标题】:Unable to fetch JSON data using retrofit2 in Android无法在 Android 中使用 retrofit2 获取 JSON 数据
【发布时间】:2019-09-30 17:52:12
【问题描述】:

我是 Android 新手。我尝试使用 retrofit2 在 android 中获取 json 数据,它显示 "connect time out" 并且什么也不显示。如果我与其他一些其他 api 一起使用相同的代码,它工作正常。 请帮我解决这个问题。提前谢谢你。

这是我的 MainActivity.java 类:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.List;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    ListView listView;

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

        listView = (ListView) findViewById(R.id.listViewHeroes);
        getUsers();
    }
    public void getUsers(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
                .build();
        Api api = retrofit.create(Api.class);
        System.out.println("api:"+api);
        Call<List<User>> call = api.getUsers();
        Log.i("inside main","method..");
        call.enqueue(new Callback<List<User>>() {

            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {

                List<User> userList = response.body();
                Log.i("hello ..","hi");
                String[] users = new String[userList.size()];

                for (int i = 0; i < userList.size(); i++) {
                    users[i] = userList.get(i).getName();
                    Log.i("User name is :"+users[i],"User list");
                    listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, users));
                }

            }

            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
                Log.i("fail","fail..");
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

API 接口

import java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;

public interface Api {
    String BASE_URL = "http://192.168.1.8:8083/FarmerWebApplication/";
    @GET("getUsers")
    Call<List<User>> getUsers();

}

User.java

import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName("uname")
    private String name;
    private String address;


    public User(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public String getName(){
        return name;
    }

    public String getAddress() {
        return address;
    }

以下是我想使用 http://192.168.1.8:8083/FarmerWebApplication/getUsers api 获取的 json 响应。 192.168.1.8是我的系统ip地址。

[
    {
        "uid": 1,
        "uname": "amit",
        "uaddress": "Bangalore"
    },
.....
]

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listViewHeroes"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

如果需要更多详细信息,请随时询问。谢谢。

【问题讨论】:

  • 复制浏览器中的 url 并检查它是否给出正确的 json 响应,如果是,请尝试像这样增加改造超时 >>stackoverflow.com/questions/29380844/…
  • @NavneetKrishna 感谢您的快速回复。我试过你的解决方案。甚至我也遇到了同样的问题。

标签: java android json retrofit2


【解决方案1】:

由于发生连接超时,改造无法完成网络。

您似乎在本地主机上运行 API。确保您在同一网络上,正确的系统 IP 地址和端口号正确。

尝试在机器浏览器上使用与移动设备中使用的相同 URL 调用 web 服务。预计会有检查响应。

【讨论】:

  • 是的,我在本地主机上运行。出于这个原因,我正在使用我的系统的 IPv4 和 Apache Tomcat 的端口地址。而且我的机器和安卓设备连接在同一个路由器上。甚至我都在解决这个问题。
  • 检查你的本地机器运行Tomcat的IP地址和端口。就我而言, 192.168.0.102:8080/api/notes 接受 GET 请求,我能够在我的移动设备上获得响应。您可以从您的移动浏览器调用相同的 url 来检查 API 是否可以访问。
【解决方案2】:

可能是您的服务器或本地主机延迟返回数据,您可以通过增加超时时间来检查它

这是

的 kotlin 代码

okhttp客户端

 val okHttpClientBuilder = OkHttpClient.Builder()
                .addInterceptor(ChuckInterceptor(application))
                .addInterceptor(AppVersionInterceptor())
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(1, TimeUnit.MINUTES)
                .writeTimeout(1, TimeUnit.MINUTES)

【讨论】:

  • 我在java代码中试过了。我把它增加到5分钟。即使它显示相同的问题。它不会进入 onResponse()。它正在跳过 onResponse() 并将控制转移到 onFailure() 方法并在 TOST 消息中显示 Connect Timed out。
【解决方案3】:

也许问题出在这里:

@SerializedName("uname")
private String name;
private String address;

你的回答是:

{
    "uid": 1,
    "uname": "amit",
    "uaddress": "Bangalore"
},

你必须在你的界面和你的响应中使用相同的名字,改变界面:

私有字符串 unname; 私有字符串uaddress;

有关更多信息,请参阅文档: https://square.github.io/retrofit/

【讨论】:

  • 感谢您的回复。我尝试过这个。即使我遇到了同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多