2016-10-13 6 views
0

私はAndroid開発の新機能です。私は、私が私のMacでdeploydを使ってローカルで作成したapiにアクセスすることによって、仕事に就くために必要な私のこの小さなプロジェクトを持っています。 apiはlocalhost:2403/subjectからアクセスできます。私は改造とgsonのガイドに従ってきましたが、これまでのところ、私は間違いを覚えていて、働くことはできません。この時点で私はちょっと固まった。私はapiから科目を取得し、スクロール可能なリストでそれらを表示する必要があります。改造できず、Gsonがデプロイしたデータを引き出す

APIと通信できるようにRetrofitとGsonをセットアップしました。したがって、私はいくつかのクラスとインターフェイスを作成しました。

まずSubjectクラス

public class Subject { 

    int id; 
    String name; 
    int ects; 
    int grade; 
    int period; 
    int main; 

    public int getMain() { 
     return main; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getEcts() { 
     return ects; 
    } 

    public int getGrade() { 
     return grade; 
    } 

    public int getPeriod() { 
     return period; 
    } 

} 

はその後、私は私が得るすべての科目を保持するために、プレーンと簡単ですHslSubjectsクラスを作成しました。

public class HslSubjects { 
    List<Subject> subjects; 
} 

とAPIインタフェースアダプタ私のmainActivityで最後に

public class SubjectResponse { 

    @SerializedName("subjects") 
    List<Subject> subjects; 

    public SubjectResponse() { 
     subjects = new ArrayList<Subject>(); 
    } 

    public static SubjectResponse parseJSON(String response) { 
     Gson gson = new GsonBuilder().create(); 
     SubjectResponse subjectResponse = gson.fromJson(response, SubjectResponse.class); 
     return subjectResponse; 
    } 
} 

続い

public interface subjectEndpointApi { 
    @GET("/subjects") 
    Call<HslSubjects> loadSubjects(); 
} 

私はすべて

public class MainActivity extends ListActivity implements Callback<HslSubjects> { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     requestWindowFeature(Window.FEATURE_PROGRESS); 
     ArrayAdapter<Subject> arrayAdapter = new ArrayAdapter<Subject>(this, android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList<Subject>()); 
     setListAdapter(arrayAdapter); 
     setProgressBarIndeterminateVisibility(true); 
     setProgressBarVisibility(true); 

     Log.i("api", "preparing to make the api call"); 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://10.0.3.2:2403") //10.0.3.2 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     // preparing the call in retrofit 
     subjectEndpointApi subjectEndpointApi = retrofit.create(subjectEndpointApi.class); 
     Call<HslSubjects> call = subjectEndpointApi.loadSubjects(); 

     call.enqueue(this); 
    } 

    @Override 
    public void onResponse(Call<HslSubjects> call, Response<HslSubjects> response) { 
     setProgressBarIndeterminateVisibility(false); 
     HslSubjects hslSubjects = response.body(); 

     Log.i("subjects", "end of response"); 


    } 

    @Override 
    public void onFailure(Call<HslSubjects> call, Throwable t) { 
     Toast.makeText(MainActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); 

     Log.i("subjects", "Oops error"); 
    } 
} 

を実行しかし、どういうわけか、それはいつもに行きますonFailureクラス。あなたのデバイス上で期待しているものではありません

enter image description here

答えて

0

は、サーバーのJSONのように思える:エミュレータは、次のエラーが発生します。 エラーはAndroidがJSON オブジェクトを望んでいますが、あなたが渡すjsonはちょっとの配列です。

ロギングを追加し、そこに問題があるかどうかを確認してください。

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

は、だから私は、あなたが何か書く必要がありますね:

public interface subjectEndpointApi { 
    @GET("/subjects") 
    Call<List<Subject>> loadSubjects(); 
} 
+0

をそれは私が)(私はコールコール= subjectEndpointApi.loadSubjectsとしてmainActivityに使用HslSubjectsで行うものではありません。 ? – Reshad

+0

インターセプタは次のような応答を返します:http://pastebin.com/raw/BKxV6inV so apparantly私はAPIから何かを取得しますが、何も処理できません – Reshad

+0

あなたは配列を受け取っていますが、オブジェクト。コードを自分の方法で変更しようとしました –

関連する問題