Retrofit 回调函数在 Android 中未得到响应
Retrofit Callback function is not getting response in Android
亲爱的 Android 开发者您好!
我正在尝试使用改造从我的网络服务中获取数据。但是当我向我的网络服务发送调用时,回调函数总是显示 onFailure。
我很小心地创建了我的改装 类,但仍然无法获取数据。另外,我获得了互联网许可。
在这里你可以看到我的改装类:
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class 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;
}
}
public class ApiUtils {
public static final String BASE_URL = "http://huseyinozkoc.com/";
//bu base link ana link olmalı alt kolları interface içerisinde belirtilir.
public static RetrofitInterface getRetrofitInterface() {
return RetrofitClient.getClient(BASE_URL).create(RetrofitInterface.class);
}
}
public interface RetrofitInterface {
@GET("turkey/get_All_details.php")
Call<PlaceCevap> getAllPlaces();
}
正如我之前提到的,我检查了所有改造 类 但没有发现任何问题。
然后我仔细尝试检查我的 MainActivity 但仍然没有看到任何异常的东西。
这是我的主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.baba);
places = new ArrayList<>();
recyclerView.setLayoutManager(new LinearLayoutManager(this.getApplicationContext()));
recyclerView.setHasFixedSize(true);
placeInterface = ApiUtils.getRetrofitInterface();
placeInterface.getAllPlaces().enqueue(new Callback<PlaceCevap>() {
@Override
public void onResponse(Call<PlaceCevap> call, Response<PlaceCevap> response) {
places = response.body().getPlaces();
adapter= new PlaceAdapter(places);
recyclerView.setAdapter(adapter);
Toast.makeText(MainActivity.this, "got response" , Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<PlaceCevap> call, Throwable t) {
Toast.makeText(MainActivity.this, "fail" , Toast.LENGTH_SHORT).show();
}
});
因此,亲爱的开发人员,为什么我没有从 Web 服务获取数据?这是什么原因呢?请写出!
大家好,开发过程顺利!
我解决了问题。首先,我接受了这个错误“不支持 CLEARTEXT 通信”。
对于解决方案,您应该将 android:usesCleartextTraffic="true"
添加到清单文件中。
然后,您应该为“java.net.SocketException:套接字失败:EPERM”错误额外添加这些权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
将它们全部添加到清单文件中。
最后,您会收到“SSL 握手失败”错误。
你应该改变你的基地 url 像“http”或“https”试试他们两个。
如果您仍然遇到错误,请构建您的项目并从模拟器中删除您的应用程序,然后再次 运行 它。
亲爱的 Android 开发者您好! 我正在尝试使用改造从我的网络服务中获取数据。但是当我向我的网络服务发送调用时,回调函数总是显示 onFailure。
我很小心地创建了我的改装 类,但仍然无法获取数据。另外,我获得了互联网许可。
在这里你可以看到我的改装类:
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class 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;
}
}
public class ApiUtils {
public static final String BASE_URL = "http://huseyinozkoc.com/";
//bu base link ana link olmalı alt kolları interface içerisinde belirtilir.
public static RetrofitInterface getRetrofitInterface() {
return RetrofitClient.getClient(BASE_URL).create(RetrofitInterface.class);
}
}
public interface RetrofitInterface {
@GET("turkey/get_All_details.php")
Call<PlaceCevap> getAllPlaces();
}
正如我之前提到的,我检查了所有改造 类 但没有发现任何问题。
然后我仔细尝试检查我的 MainActivity 但仍然没有看到任何异常的东西。
这是我的主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.baba);
places = new ArrayList<>();
recyclerView.setLayoutManager(new LinearLayoutManager(this.getApplicationContext()));
recyclerView.setHasFixedSize(true);
placeInterface = ApiUtils.getRetrofitInterface();
placeInterface.getAllPlaces().enqueue(new Callback<PlaceCevap>() {
@Override
public void onResponse(Call<PlaceCevap> call, Response<PlaceCevap> response) {
places = response.body().getPlaces();
adapter= new PlaceAdapter(places);
recyclerView.setAdapter(adapter);
Toast.makeText(MainActivity.this, "got response" , Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<PlaceCevap> call, Throwable t) {
Toast.makeText(MainActivity.this, "fail" , Toast.LENGTH_SHORT).show();
}
});
因此,亲爱的开发人员,为什么我没有从 Web 服务获取数据?这是什么原因呢?请写出! 大家好,开发过程顺利!
我解决了问题。首先,我接受了这个错误“不支持 CLEARTEXT 通信”。
对于解决方案,您应该将 android:usesCleartextTraffic="true"
添加到清单文件中。
然后,您应该为“java.net.SocketException:套接字失败:EPERM”错误额外添加这些权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
将它们全部添加到清单文件中。
最后,您会收到“SSL 握手失败”错误。 你应该改变你的基地 url 像“http”或“https”试试他们两个。
如果您仍然遇到错误,请构建您的项目并从模拟器中删除您的应用程序,然后再次 运行 它。