2016-08-26 2 views
0

Я сейчас пытаюсь разобрать JSON по этой ссылке ("https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=fdac2e9676991ac53b34651adab52518&format=json&nojsoncallback=1&auth_token=72157671978046542-6e266595ffed01f8&api_sig=58e08d365779a8f2e946a2b5320199e2")Android: Проблемы с Модернизированным 2 и GSON & JSON

Это то, что я в моем Java:

package com.example.karim.bluecrunch; 

import com.google.gson.annotations.SerializedName; 

public class SinglePhotoRetrofit { 
@SerializedName("id") 
public String id; 
@SerializedName("owner") 
public String owner; 
@SerializedName("secret") 
public String secret; 
@SerializedName("server") 
public String server; 
@SerializedName("farm") 
    public int farm;  

    @SerializedName("title") 
    public String title; 

    @SerializedName("ispublic") 
    public int ispublic; 

    @SerializedName("isfriend") 
    public int isfriend; 

    @SerializedName("isfamily") 
    public int isfamily; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
} 

и

package com.example.karim.bluecrunch; 

import com.google.gson.annotations.SerializedName;  
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by karim on 8/26/16. 
*/ 
public class PhotosRetrofit { 
    @SerializedName("page") 
    public int page; 

    @SerializedName("pages") 
    public int pages; 

    @SerializedName("perpage") 
    public int perpage; 

    @SerializedName("total") 
    public String total; 

    @SerializedName("photo") 
    public List<SinglePhotoRetrofit> photo; 

    @SerializedName("stat") 
    public String stat; 

    public List<SinglePhotoRetrofit> getPhoto() { 
     return photo; 
    } 

    public void setPhoto(List<SinglePhotoRetrofit> photo) { 
     this.photo = photo; 
    } 

    public String getTotal() { 
     return total; 
    } 

    public void setTotal(String total) { 
     this.total = total; 
    } 
}` 

и вот мой интерфейс

package com.example.karim.bluecrunch; 

import java.util.List;  
import retrofit2.Call; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 
import retrofit2.http.GET; 
import retrofit2.http.Path; 
import retrofit2.http.Query; 

/** 
* Created by karim on 8/26/16. 
*/ 
public interface HandleRetrofit { 
/* 
https://api.flickr.com/services/rest/?method=flickr.photos.search 
&api_key=6d5c5a20d108f8f56f324394d3e2381f 
&format=json 
&nojsoncallback=1 
&auth_token=72157672948729705-c211cbcbcac8bb30 
&api_sig=bd73bb34b0f29390a80c6ffdbb376c97 

*/ 
    @GET("rest/?") 
    Call<PhotosRetrofit> Photos (
      @Query("method") String method, 
      @Query("api_key") String key, 
      @Query("format") String format, 
      @Query("nojsoncallback") int call_back, 
      @Query("auth_token") String token, 
      @Query("api_sig") String sig 
    ); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("https://api.flickr.com/services/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
} 

и мой MainActivity выглядит ->

package com.example.karim.bluecrunch; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
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); 

       /* 
https://api.flickr.com/services/rest/?method=flickr.photos.search 
&api_key=fdac2e9676991ac53b34651adab52518 
&format=json&nojsoncallback=1 
&auth_token=72157671978046542-6e266595ffed01f8 
&api_sig=58e08d365779a8f2e946a2b5320199e2 
*/ 
       final String API_KEY = "fdac2e9676991ac53b34651adab52518"; 
       final String METHOD = "flickr.photos.search"; 
       final String AUTH_TOKEN = "72157671978046542-6e266595ffed01f8"; 
       final String API_SIG = "58e08d365779a8f2e946a2b5320199e2"; 
       final String FORMAT = "json"; 
       final int CALL_BACK = 1; 

     HandleRetrofit handleRetrofit = HandleRetrofit.retrofit.create(HandleRetrofit.class); 
     Call<PhotosRetrofit> call = handleRetrofit.Photos(METHOD,API_KEY,FORMAT,CALL_BACK,AUTH_TOKEN,API_SIG); 
     call.enqueue(new Callback<PhotosRetrofit>() { 
        @Override 
        public void onResponse(Call<PhotosRetrofit> call, Response<PhotosRetrofit> response) { 
         Log.d("MainActivity", "Status Code = " + response.code()); 
         TextView textView = (TextView) findViewById(R.id.photoTitle); 

         PhotosRetrofit photosRetrofit = response.body(); 

         textView.setText(photosRetrofit.total+"\n");  

         Log.w("---___---Respones","Hereeeeeeeeeeeeeeeeeeee"); 
        } 

        @Override 
        public void onFailure(Call<PhotosRetrofit> call, Throwable t) { 
         Toast.makeText(MainActivity.this,"Error :"+t.getMessage(),Toast.LENGTH_LONG).show(); 
         Log.w("---___--- Error ",t.getMessage()); 
        } 
       });  
    } 
} 

возвращает нуль в моем TextView, также я попытался все больше и больше, чтобы получить различные данные, но я не смог на этом.

+0

Этот вопрос не может в настоящее время быть отредактированы, по этой причине: '" Ссылки to ideone.com должен сопровождаться кодом. Пожалуйста, отпечатайте весь код на 4 пробела, используя кнопку панели инструментов кода или клавиатуру CTRL + K tcut. Для получения дополнительной помощи по редактированию щелкните значок панели инструментов [?]. «Пожалуйста, отредактируйте вопрос. – halfer

+0

(Чтобы уточнить, пожалуйста, добавьте свой код _to_, вместо того, чтобы указывать на ссылки на Pasteboard. Фильтр содержимого существует для Причина: – halfer

+0

Это проводной! Я предпочитаю добавлять свои коды в ссылки, потому что они показывают их более ясно, чем вставлять их здесь! Итак, почему Stackoverflow принуждает меня к этому !! –

ответ

0

Создайте еще один класс:

public class Photos{ 
    public PhotosRetrofit photos; 
} 

Update ваш интерфейс:

Call<Photos> Photos (...) 

Update Активность:

Call<Photos> call = handleRetrofit.Photos(METHOD,API_KEY,FORMAT,CALL_BACK,AUTH_TOKEN,API_SIG); 
call.enqueue(new Callback<Photos>() { 
    @Override 
    public void onResponse(Call<Photos> call, Response<Photos> response) { 
     TextView textView = (TextView) findViewById(R.id.photoTitle); 
     PhotosRetrofit photosRetrofit = response.body().photos; 
     textView.setText(photosRetrofit.total+"\n"); 
    .... 
+0

Ты лучший мужчина в мире !!, Ты спас мне жизнь! Finalyyyyyyyyyyyyyyy, I t Работает !! Но, я хочу задать вам всего лишь 2 вопроса 1- Почему вы думаете, что это должна быть другая модель для обработки PhotosRerofit (хотя в форманте JSON есть только одна информация о PhotosRerofit) 2- Если я хочу пройти фотографии в Glide Library с помощью Recycler View, что точно мне понадобится или в другом значении, что я передам параметру Glide, чтобы показать мои фотографии, полученные из Flickr-API –

+0

О модели. Я просто могу предложить вам переименовать Photos в PhotosRetrofit и старые PhotosRetrofit в Photos. Затем вы можете объявить класс Photos как внутренний класс PhotosRetroft.Итак, код будет выглядеть примерно так: public class PhotosRetrofit { Публичный класс Фотографии { @SerializedName ("page") public int page; @SerializedName ("pages") public int pages; .... } Публичные фотографии Фотографии; } Об api. Я работаю с flickr api. Но вы можете узнать о url там: https://www.flickr.com/services/api/misc.urls.html –

+0

Итак, окончательная ссылка будет выглядеть так: https://farm9.staticflickr.com /8162/29170354321_741f107275_z.jpg –

0

Использование @Query добавляет параметры к URL. Это приводит к двойным параметрам, и API не принимает/не понимает ваш запрос. Либо укажите URL-адрес, который не содержит параметров, либо используйте @Path.

Смотрите в документации в разделе "URL" Манипуляция http://square.github.io/retrofit/

EDIT: Кажется, я понял. Вы должны использовать @Query, но не включать запросов пути сам себе Например:

@GET("rest/?&format=json&nojsoncallback=1") 
Call<PhotosRetrofit> Photos (
    @Query("method") String method, 
    @Query("api_key") String key, 
    @Query("auth_token") String token, 
    @Query("api_sig") String sig 
); 

Значение @Query должно быть точное значение, что запрос-путь должен содержать.

+0

Спасибо за ур ответ Но, на самом деле я использовал '@ Путь', но logcat показывает мне это сообщение " java.lang.RuntimeException: Невозможно запустить Activity ComponentInfo {com.example.karim.bluecrunch/com.example.karim .bluecrunch.MainActivity}: java.lang.IllegalArgumentException: строка запроса URL-адреса: "method = {method} & api_key = {key} & format = json & nojsoncallback = 1 & auth_token = {token} & api_sig = {sig}" не должен иметь заменяющего блока. Для динамических параметров запроса используйте '@ Query'. Итак, я переключаю' @ Path' на '@ Query', я был бы более благодарен, если бы вы показали мне правильный статус для использования' @ Path' в этом случае. –

+0

Извините, я верю Я не понял, вы действительно должны использовать @Query. Кроме того, у url уже нет элементов 'method =', 'key =', 'auth_token =', ect. –

+0

Итак, я уверен в связи с тем, если вы посмотрите на мою MainActivity на этих двух линиях - Log.d («MainActivity», «Status Code =» + response.code()); - Log.w («---___--- Respones »,„Hereeeeeeeeeeeeeeeeeeee“!); И оба показаны на моем LogCat Но проблема TextView показывает пустой текст внутри Пожалуйста, обратите внимание, что это мой первый раз, чтобы использовать Flickr-API, и я не уверен, что использую его правильно или нет. –