首页 > 解决方案 > Retrofit2 应用程序崩溃或提供意外输出

问题描述

我创建了一个 python 烧瓶 Web 服务,并使用 apache 将其部署在 localhost:5000 上,它以 JSON 格式返回数据。现在我必须编写一个 android 应用程序来调用 Web 服务并返回数据。但是一旦我运行应用程序,模拟器就会崩溃并重新打开。然后有时应用程序会打开,当我单击连接时,会转到 onFailure()。

GetJobs.java(接口)-

package com.example.jobs4;

import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.http.GET;

public interface GetJobs {
    @GET("/getjobs")
    Call<ArrayList<RetroJobs>> getAllJobs();
}

RetroJobs.java(数据模型)-

package com.example.jobs4;

import com.google.gson.annotations.SerializedName;

public class RetroJobs {
    @SerializedName("name")
    private String name;
    @SerializedName("id")
    private String id;
    @SerializedName("run_start")
    private String run_start;
    @SerializedName("run_end")
    private String run_end;
    @SerializedName("scheduled_date")
    private String scheduled_date;
    @SerializedName("status")
    private String status;

    public RetroJobs(String name, String id, String scheduled_date, String run_start, String run_end, String status) {
        this.name = name;
        this.scheduled_date = scheduled_date;
        this.run_start = run_start;
        this.run_end = run_end;
        this.id = id;
        this.status = status;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getScheduled_date() {
        return scheduled_date;
    }
    public void setScheduled_date(String scheduled_date) {
        this.scheduled_date = scheduled_date;
    }

    public String getRun_start() {
        return run_start;
    }
    public void setRun_start(String run_start) {
        this.run_start = run_start;
    }

    public String getRun_end() {
        return run_end;
    }
    public void setRun_end(String run_end) {
        this.run_end = run_end;
    }

    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

RetrofitClient.java(改造实例)-

package com.example.jobs4;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit;
    private static final String BASE_URL = "http://10.0.2.2:5000";

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

MainActivity.java-

package com.example.jobs4;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    ListView listView;
    ArrayList<RetroJobs> list;
    ArrayAdapter<RetroJobs> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startCon(View view){

        GetJobs service = RetrofitClient.getRetrofitInstance().create(GetJobs.class);

        Call<ArrayList<RetroJobs>> call = service.getAllJobs();
        call.enqueue(new Callback<ArrayList<RetroJobs>>() {

            @Override
            public void onResponse(Call<ArrayList<RetroJobs>> call, Response<ArrayList<RetroJobs>> response) {
                listView = findViewById(R.id.lv);
                list = new ArrayList<>();
                list = response.body();
                adapter = new ArrayAdapter<RetroJobs>(MainActivity.this,android.R.layout.simple_list_item_1,list);
                adapter.notifyDataSetChanged();
                listView.setAdapter(adapter);
            }

            @Override
            public void onFailure(Call<ArrayList<RetroJobs>> call, Throwable throwable) {
                Toast.makeText(MainActivity.this, "Oops! Unable to load!", Toast.LENGTH_SHORT).show();
            }
        });
    }

}

我已经使用邮递员测试了我的网络服务。我直接在模拟器上打开了网址,正确返回了json数据。这就是它返回的内容-

[{"id":19,"name":"temp_st_ser","run_end":"13:20:10","run_start":"13:00:15","scheduled_date":"2019-08-04","status":0},{"id":11,"name":"st_sch","run_end":"10:24:17","run_start":"10:10:05","scheduled_date":"2019-05-14","status":1},{"id":5,"name":"sch_main","run_end":"11:44:22","run_start":"11:12:00","scheduled_date":"2019-03-09","status":0}]

编辑:现在突然打开,但在列表视图上给出这个输出 -

com.example.jobs4.RetroJobs@ebffc7e 

com.example.jobs4.RetroJobs@e2215df

com.example.jobs4.RetroJobs@23a722c

日志猫-

2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void com.example.jobs4.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:26)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.Activity.performCreate(android.os.Bundle, android.os.PersistableBundle) (Activity.java:7009)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:7000)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1214)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2731)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
2019-06-07 16:57:58.399 14731-14731/com.example.jobs4 I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
2019-06-07 16:57:58.400 14731-14731/com.example.jobs4 I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
2019-06-07 16:57:58.400 14731-14731/com.example.jobs4 I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
2019-06-07 16:57:58.400 14731-14731/com.example.jobs4 I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2019-06-07 16:57:58.400 14731-14731/com.example.jobs4 I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
2019-06-07 16:57:58.400 14731-14731/com.example.jobs4 I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
2019-06-07 16:57:58.481 14731-14748/com.example.jobs4 D/OpenGLRenderer: HWUI GL Pipeline
2019-06-07 16:57:58.542 14731-14748/com.example.jobs4 I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-06-07 16:57:58.542 14731-14748/com.example.jobs4 I/OpenGLRenderer: Initialized EGL, version 1.4
2019-06-07 16:57:58.542 14731-14748/com.example.jobs4 D/OpenGLRenderer: Swap behavior 1
2019-06-07 16:57:58.542 14731-14748/com.example.jobs4 W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2019-06-07 16:57:58.542 14731-14748/com.example.jobs4 D/OpenGLRenderer: Swap behavior 0
2019-06-07 16:57:58.573 14731-14748/com.example.jobs4 D/EGL_emulation: eglCreateContext: 0xea62c280: maj 2 min 0 rcv 2
2019-06-07 16:57:58.576 14731-14748/com.example.jobs4 D/EGL_emulation: eglMakeCurrent: 0xea62c280: ver 2 0 (tinfo 0xdfeff2a0)
2019-06-07 16:57:58.662 14731-14748/com.example.jobs4 D/EGL_emulation: eglMakeCurrent: 0xea62c280: ver 2 0 (tinfo 0xdfeff2a0)
2019-06-07 16:58:08.418 14731-14731/com.example.jobs4 D/NetworkSecurityConfig: No Network Security Config specified, using platform default

完整的 Logcat - https://drive.google.com/drive/folders/1K-TcyzeWqlNghOtBsLMNMQruViDzYfCC?usp=sharing

标签: androidjsonretrofit2

解决方案


推荐阅读