You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:12:14