Android使用Retrofit遭遇java.net.UnknownHostException问题求助
解决Retrofit中的UnknownHostException错误:无法解析主机"tfg.test"
遇到的错误:java.net.UnknownHostException: Unable to resolve host "tfg.test": No address associated with hostname。已尝试在Manifest中添加INTERNET权限、使用联网的物理设备,但问题仍未解决。
相关代码文件
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.retrofitpruebabuena"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.RetrofitPruebaBuena" tools:targetApi="31" android:usesCleartextTraffic="true"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
API.java
package com.example.retrofitpruebabuena.API; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class API { public static final String BASE_URL="http://tfg.test/"; private static Retrofit retrofit = null; public static Retrofit getApi(){ if (retrofit==null){ retrofit=new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }
MainActivity.java
package com.example.retrofitpruebabuena; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.example.retrofitpruebabuena.API.API; import com.example.retrofitpruebabuena.API.ApiService; import com.example.retrofitpruebabuena.models.Alumno; import java.io.IOException; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ApiService service= API.getApi().create(ApiService.class); Call<List<Alumno>> alumnosCall=service.getStudents(25); alumnosCall.enqueue(new Callback<List<Alumno>>() { @Override public void onResponse(Call<List<Alumno>> call, Response<List<Alumno>> response) { if(response.isSuccessful()){ List<Alumno> alumnos=response.body(); Toast.makeText(MainActivity.this, "El servidor retornó datos", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "El servidor retornó un error", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<List<Alumno>> call, Throwable t) { if(t instanceof IOException){ Toast.makeText(MainActivity.this, "Error de conexión", Toast.LENGTH_SHORT).show(); t.printStackTrace(); }else{ Toast.makeText(MainActivity.this, "Problema de conversión", Toast.LENGTH_SHORT).show(); } } }); } }
ApiService.java
package com.example.retrofitpruebabuena.API; import com.example.retrofitpruebabuena.models.Alumno; import java.util.List; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; import retrofit2.http.Query; public interface ApiService { @GET("api/courses/{course}") Call<List<Alumno>> getStudents(@Path("course") int course); }
解决方案
- 替换自定义域名为IP地址:
tfg.test是本地自定义域名,物理设备无法通过公共DNS解析。找到服务器所在机器的局域网IP(比如192.168.1.105),修改API类中的BASE_URL为"http://192.168.1.105/"。 - 确认设备与服务器同网络:确保你的安卓设备和运行
tfg.test服务器的电脑连接在同一个Wi-Fi局域网下。 - 验证服务器可用性:在电脑浏览器中访问
http://tfg.test/api/courses/25,确认能正常返回JSON数据。如果浏览器也无法访问,检查服务器是否启动、端口是否开放。 - 关闭设备代理:如果安卓设备开启了HTTP代理,会干扰域名解析,关闭代理后重试请求。
内容的提问来源于stack exchange,提问作者lewis04
相关产品推荐
相关产品推荐

