Использование JSON для помещения объектов в просмотрщик - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь использовать JSON для вставки изображений в представление переработчика. Кажется, что информация читается, но она никогда не останавливается и в итоге дает мне исключение из-за нехватки памяти. Трассировка говорит, что фоновая липкая одновременная метка G C освобождается снова и снова в течение примерно 2 минут, а затем выдает ошибку. Настоящая ошибка здесь не ясна для меня, или я бы дал больше информации, пожалуйста, задавайте вопросы для уточнения, если вам это нужно.

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://dog.ceo/api/breeds/image/random/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        JsonAnimalApi jsonAnimalApi = retrofit.create(JsonAnimalApi.class);
        Call<Animal> call = jsonAnimalApi.getAnimals();
        System.out.println("Here");
        call.enqueue(new Callback<Animal>() {
            @Override
            public void onResponse(Call<Animal> call, Response<Animal> response) {
                System.out.println("HERE");
                if (response.isSuccessful()) {
                    while (names.size() < 50) names.add(response.body().getPicture());
                    tvResponse.setText("Code: " + response.code());
                    return;
                }
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
        RecyclerViewAdapter rAdapter = new RecyclerViewAdapter(names, this);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(rAdapter);
public interface JsonAnimalApi {
    @GET("animals")
    Call<Animal> getAnimals();
}
public class Animal {
    private ImageView  picture;
    private String status;
    private String message;

    public ImageView getPicture() {
        return picture;
    }

    public String getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private ArrayList<ImageView> mAnimalNames;
    private OnNoteListener mOnNote;
    public RecyclerViewAdapter(ArrayList<ImageView> mAnimalNames, OnNoteListener mOnNote) {
        this.mAnimalNames = mAnimalNames;
        this.mOnNote = mOnNote;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem, parent, false);
        ViewHolder holder = new ViewHolder(view, mOnNote);
        return holder;
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder: ");
    }
    @Override
    public int getItemCount() {
        return mAnimalNames.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageView animalName;
        OnNoteListener onNote;
        public ViewHolder(@NonNull View itemView, OnNoteListener onNote) {
            super(itemView);
            animalName = itemView.findViewById(R.id.animal_name);
            this.onNote = onNote;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            mOnNote.onNoteClick(getAdapterPosition(), mAnimalNames);
        }
    }

    public interface OnNoteListener {
        void onNoteClick(int pos, ArrayList<ImageView> names);
    }
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Я вижу пару проблем: похоже, вы пытаетесь использовать Gson для непосредственного заполнения ImageView:

public class Animal {
    private ImageView  picture;

Это не сработает, потому что независимо от формата * Атрибут 1005 * находится в несовместимом с внутренней реализацией ImageView (и эта внутренняя реализация может измениться без предупреждения).

Но у вас есть более фундаментальная проблема в вашей onResponse - ваша условная перевернуто:

if (!response.isSuccessful()) {

Вы добавляете элементы только в том случае, если ответ не успешен, а не если это так.

Помимо этого, в зависимости от В остальной части кода вам может потребоваться использовать один из методов notify... на вашем адаптере, чтобы сообщить RecyclerView о новых элементах.

0 голосов
/ 24 апреля 2020

По какой-то причине вы включаете imageView в свой класс животных, поэтому удалите его:

public class Animal {

private String status;
private String message;



public String getStatus() {
    return status;
}

public String getMessage() {
    return message;
}
 }

while l oop

 //names must be of type string

while (names.size() < 50) names.add(response.body().getMessage());

И mAnimalNames в адаптере должен иметь тип String

private ArrayList<String> mAnimalNames;

//constructor
public RecyclerViewAdapter(ArrayList<String> mAnimalNames,.......... 

Также не уверен, зачем использовать некоторое время l oop, возможно, пытаясь заполнить список:

Сделайте это:

 @Override
public void onResponse(Call<Animal> call, Response<Animal> response) {

if(response.isSuccessful()){
for(int i=0 ; i<50 ; i++){
//names has to be of type String
names.add(response.body().getMessage())
}
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
RecyclerViewAdapter rAdapter = new RecyclerViewAdapter(names, this);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(rAdapter);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...