Retrofit-Callback.onFailure is called


Retrofit-Callback.onFailure is called

我正在尝试运行一个简单的测试应用程序来学习改装。onFailure方法总是被调用,请帮帮我。我所做的如下:

MainActivity

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        method();
    }
    public void method()
    {
        final String BASE_URL = "http://192.168.1.7/";
        Retrofit retrofit = new Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
        ApiService service = retrofit.create(ApiService.class);
        Call<ResponseBody> call = service.login();
        call.enqueue(new Callback<ResponseBody>(){ 
            @Override
            public void onResponse(Response<ResponseBody> response, Retrofit retrofit) 
            {
                // TODO Auto-generated method stub
                if (response.isSuccess())
                {
                    Log.i("mok","S");
                    ResponseBody rb = response.body();
                }
                else
                {
                    Log.i("mok","F");
                    com.squareup.okhttp.ResponseBody rb = response.errorBody();
                }
            }
            @Override
            public void onFailure(Throwable t) 
            {
                Log.i("mok",t.getCause()+"");//This is null
                Log.i("mok","T");//This is shown in LogCat
                finish();
            }
        });
    }
}

RespnseBody:

public class ResponseBody 
{
    private String username;
    private String password;
    public ResponseBody(String username, String password)
    {
        this.setUsername(username);
        this.setPassword(password);
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

ApiService:

public interface ApiService 
{
    @POST("test_retrofit.php")
    public Call<ResponseBody> login();
}

test_retrofit.php://位于www目录(在我的计算机上运行wampserver)

<?php 
$response = array("error" => FALSE);
if ( isset($_POST['username']) )
{
    $response["username"] = "moker";
    $response["password"] = "0107";
    echo json_encode($response);
}
else
{
    $response["username"] = "mok";
    $response["password"] = "107";
    echo json_encode($response);
}
?>

编辑:(在iagreen的有用提示之后)

例外情况是:

java.net.SocketTimeoutException:在10000ms 后无法连接到192.168.1.7(端口80)

您的设备似乎无法连接到服务器。你在测试改装的同一台设备上测试过吗?另一种选择是设备在不同的网络上。192.168.x.x是一个专用IP,因此如果手机不在同一个子网,它将找不到服务器。或者,事实证明,你需要确保你的防火墙允许连接到你的服务器。

删除BASE_URL的最后一个斜杠,并将其放在@POST("test_retrofit.php")=>@POST("/test_retrofitphp")的开头