带有 Retrofit2 的 Android 应用程序崩溃而没有错误消息



我正在开发一个安卓应用程序,它需要使用目前部署在 heroku 实例上的 rest api...由于我每次尝试将改造集成为 HTTP 客户端时都遇到崩溃,因此我做了以下操作:

添加了 retrofit2 作为依赖项(为了避免潜在的成熟度问题,没有选择最新版本(

compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.6.2'

我编写了一个示例 android 应用程序,只是为了检查我的原始应用程序中是否做错了什么,使用 http://httpbin.org/ip

public interface HttpBinService
{
public static class Response
{
    private String origin;
    public Response(String origin) {
        this.origin = origin;
    }
    public String getOrigin() {
        return origin;
    }
    public void setOrigin(String origin) {
        this.origin = origin;
    }
}
@GET("ip")
public Call<Response> getIp ();
}

和主要活动

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Retrofit setup
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://httpbin.org")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    // Service setup
    HttpBinService service = retrofit.create(HttpBinService.class);
    try {
        Call<HttpBinService.Response> call = service.getIp();
        Response<HttpBinService.Response> res = call.execute();
        if (res.isSuccessful()){
            Log.i("PROVARETROFIT", "OK");
            ((TextView)findViewById(R.id.testo)).setText(res.body().getOrigin());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

我没有忘记在我的清单中请求互联网权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="it.spich.provaretrofit">
<uses-permission android:name="android.permission.INTERNET"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

但我得到的只是应用程序意外关闭。如果在调试中执行它,它将正确执行所有步骤,直到调用执行。LogCat似乎没有说任何有用的东西

04-15 09:48:08.281 6491-6491/? I/art: Late-enabling -Xcheck:jni
04-15 09:48:08.367 6491-6491/? W/System: ClassLoader referenced unknown path: /data/app/it.spich.provaretrofit-1/lib/arm64
04-15 09:48:08.387 6491-6491/it.spich.provaretrofit I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
04-15 09:48:08.577 6491-6491/? I/Process: Sending signal. PID: 6491 SIG: 9

有人知道那里发生了什么吗?

不知道为什么 logcat 没有显示任何有用的东西。但是在执行它时,它会给出一个 android.os.NetworkOnMainThreadException ,这可以解释问题。所以正如他们在评论中所说:尝试将 enque 方法与回调一起使用,这也可以让您摆脱 try/catch 语句。尝试将主活动中// Service setup后的代码替换为:

    HttpBinService service = retrofit.create(HttpBinService.class);
    Call<HttpBinService.Response> call = service.getIp();
    call.enqueue(new Callback<HttpBinService.Response>() {
        @Override
        public void onResponse(Call<HttpBinService.Response> call, Response<HttpBinService.Response> response) {
            if (response.isSuccessful()){
                Log.i("PROVARETROFIT", "OK");
//((TextView)findViewById(R.id.testo)).setText(res.body().getOrigin());
                System.out.println(response.body().getOrigin());
            } else {
                System.out.println("Unsuccesfull");
            }
        }
        @Override
        public void onFailure(Call<HttpBinService.Response> call, Throwable t) {
            System.out.println("Call failed");
        }
    });

最新更新