Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Problemas com call.enqueue

Boa noite comunidade,

Eis meu problema: o call.enqueue não está chamando nem o onResponse nem o onFailure. Obs: Estou fazendo em um projeto a parte, acompanhando o projeto do curso "Curso Android com Web Service parte 1: Sincronize sua app com o servidor" funciona perfeitamente. coloquei logs e não está exibindo no console, nem o breakpoint em modo Debug entra no onResponse e onFailure. estou chamando em um fragment, isso influência? abaixo está a classe e o log do erro, o erro mostra que a List está null, mas como se vê no log o json é retornado normalmente do Server. Por favor, me ajudem =D

Fragment:

package br.com.aos.lanshow;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.util.List;

import br.com.aos.lanshow.adapter.ProdutosAdapter;
import br.com.aos.lanshow.modelo.Produto;
import br.com.aos.lanshow.retrofit.RetrofitInicializador;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ListaProdutosFragment extends Fragment {

    private List<Produto> produtos;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_lista_produtos, container, false);
        getProdutosServer();
        ProdutosAdapter adapter = new ProdutosAdapter(getContext(), produtos);
        ListView lista = (ListView) view.findViewById(R.id.produtos_lista);
        lista.setAdapter(adapter);

        return view;
    }

    private void getProdutosServer() {

        Call<List<Produto>> call = new RetrofitInicializador().getProdutoService().lista();
        call.enqueue(new Callback<List<Produto>>() {

            @Override
            public void onResponse(Call<List<Produto>> call, Response<List<Produto>> response) {
                Log.i("onResponse chamado", "onResponse: ");
                produtos = response.body();
            }

            @Override
            public void onFailure(Call<List<Produto>> call, Throwable t) {
                Log.e("onFaillure chamado ", t.getMessage());
            }
        });
    }
}
7 respostas

Log:

12-12 21:46:41.234 9156-9317/br.com.aos.lanshow D/OkHttp: --> GET http://192.168.1.193:8080/produtos http/1.1
12-12 21:46:41.234 9156-9317/br.com.aos.lanshow D/OkHttp: --> END GET

                                                          --------- beginning of crash
12-12 21:46:41.234 9156-9156/br.com.aos.lanshow E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: br.com.aos.lanshow, PID: 9156
                                                                  java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.aos.lanshow/br.com.aos.lanshow.ProdutosActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
                                                                      at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6123)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
                                                                   Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                      at br.com.aos.lanshow.adapter.ProdutosAdapter.getCount(ProdutosAdapter.java:26)
                                                                      at android.widget.ListView.setAdapter(ListView.java:493)
                                                                      at br.com.aos.lanshow.ListaProdutosFragment.onCreateView(ListaProdutosFragment.java:37)

continuação do Log: ...

...
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
12-12 21:46:41.294 9156-9317/br.com.aos.lanshow D/OkHttp: <-- 200 OK http://192.168.1.193:8080/produtos (59ms)
12-12 21:46:41.294 9156-9317/br.com.aos.lanshow D/OkHttp: Content-Type: application/json
12-12 21:46:41.294 9156-9317/br.com.aos.lanshow D/OkHttp: Date: Wed, 13 Dec 2017 00:46:39 GMT
12-12 21:46:41.294 9156-9317/br.com.aos.lanshow D/OkHttp: Content-Length: 5715
12-12 21:46:41.296 9156-9317/br.com.aos.lanshow D/OkHttp: [{"idProduto":1,"nome":"Produto_01","descricao":"Descricao do produto 01","valor":10.0,"situacao":"DISPONIVEL"},{"idProduto":2,"nome":"Produto_02","descricao":"Descricao do produto 02","valor":20.0,"situacao":"DISPONIVEL"},{"idProduto":3,"nome":"Produto_03","descricao":"Descricao do produto 03","valor":30.0,"situacao":"DISPONIVEL"},{"idProduto":4,"nome":"Produto_04","descricao":"Descricao do produto 04","valor":40.0,"situacao":"DISPONIVEL"},{"idProduto":5,"nome":"Produto_05","descricao":"Descricao do produto 05","valor":50.0,"situacao":"DISPONIVEL"},{"idProduto":6,"nome":"Produto_06","descricao":"Descricao do produto 06","valor":60.0,"situacao":"DISPONIVEL"},{"idProduto":7,"nome":"Produto_07","descricao":"Descricao do produto 07","valor":70.0,"situacao":"DISPONIVEL"},{"idProduto":8,"nome":"Produto_08","descricao":"Descricao do produto 08","valor":80.0,"situacao":"DISPONIVEL"},{"idProduto":9,"nome":"Produto_09","descricao":"Descricao do produto 09","valor":90.0,"situacao":"DISPONIVEL"},{"idProduto":10,"nome":"Produto_010","descricao":"Descricao do produto 010","valor":100.0,"situacao":"DISPONIVEL"}]
12-12 21:46:41.296 9156-9317/br.com.aos.lanshow D/OkHttp: <-- END HTTP (5715-byte body)

Desde já agradeço!

Olá Arthur, tudo certo?

O método enqueue da Call dispara um processo assíncrono que vai executar em paralelo com a thread principal da sua Activity. Logo, quando você coloca a chamada para montagem do adapter, no método onCreate, logo após o enqueue, pode ser que a call ainda não tenha terminado sua execução e a lista de produtos ainda esteja null. Minha sugestão seria colocar o seguinte trecho de código dentro do método onResponse da call:

ProdutosAdapter adapter = new ProdutosAdapter(getContext(), produtos);
ListView lista = (ListView) view.findViewById(R.id.produtos_lista);
lista.setAdapter(adapter);

Assim, somente quando a aplicação receber a resposta do servidor com os produtos, ela monta a lista com eles.

Abraços!

solução!

Bom dia,

Obrigado pela resposta. Realmente faz todo o sentido, agora que você explicou. =D

Assim que possível irei testar e informo o resultado. Obrigado novamente.

Vinicius Viali,

Funcionou perfeitamente cara, era exatamente isso. muito obrigado novamente.

Bons estudos à todos!

Acabei marcando minha resposta como solução. Alguém sabe como mudar a solução?