Ver mensagens sem resposta | Ver tópicos ativos Hoje é 11 Dez 2019, 00:29



Responder Tópico  [ 8 Mensagens ] 
 Consumindo JSON usando Volley Framework + Google Gson 
Autor Mensagem
Google employee
Google employee

Data de registro: 28 Jan 2011, 11:42
Mensagens: 1037
Localização: Rio Grande do Sul
Mensagem Consumindo JSON usando Volley Framework + Google Gson
Volley Framework + Google Gson

Pessoal, quem acompanhou o Google I/O 2013 notou que eles apresentaram um framework chamado Volley, definido por eles como: Easy, fast networking for android.
Quem quiser dar uma olhada na apresentação, pode assistir através deste link: https://developers.google.com/events/io ... /325304728

Estava trabalhando em um projeto que tinha a necessidade de consumir dados no formato json de um webservice, então resolvi testar o volley. Gostei do resultado e resolvi publicar um artigo aqui no forum para caso alguém também resolva utilizá-lo, ter um ponto de partida.

Para facilitar o manuseio das respostas do webservice, utilizei também a biblioteca Google Gson, esta que é uma biblioteca para transformar json para objeto e vice-versa. Facilitando nossa vida para popular nosso model da aplicação.

Pré requisitos: Baixar o Volley e o Google Gson.
- Volley:
1. Clone o repositório do projeto ( https://android.googlesource.com/platfo ... rks/volley ).
2. Crie um novo projeto a partir de um código já existente (File/New/Other/Android Project from existing Code) e navegue até os arquivos do volley.
3. Precisamos transformar este projeto em uma bliblioteca, para que ele possa ser importado ao nosso projeto. Clique com o botão direito em cima do projeto e vá em propriedades. No menu a esquerda, selecione a opção android. Nas opções deste menu, bem em baixo, tem uma opção, is library. Selecione esta opção para tornar este projeto uma biblioteca. (a figura abaixo ilustra este processo)

Imagem

- Google Gson:
1. Acesse o site do Gson e baixe o zip que contém o arquivo *.jar que precisamos (https://code.google.com/p/google-gson/).
2. Descompacte o arquivo zip baixado, e separe o arquivo gson-2.2.4.jar (última versão lançada quando este tutorial foi escrito).

Neste ponto, as bibliotecas estão prontas para serem utilizadas, vamos então criar o nosso projeto que irá consumir o json. Crie um novo projeto Android. Vou utilizar o nome de JSONAPI.

Verifique se a pasta "libs" foi criada dentro da raiz do projeto, caso não tenha sido criada, crie-a manualmente. (JSONAPI/libs).

Primeiramente, vamos inserir o Gson no projeto. Copie o arquivo gson-2.2.4.jar para dentro da pasta "libs" do projeto.

Imagem


Agora precisamos adicionar esta biblioteca no path da aplicação para que ela possa ser utilizada: clique com o botão direito em cima do projeto e vá em propriedades. Selecione no menu a esquerda a opção "Java Build Path". Nas opções a direita, selecione a aba "Libraries" e clique no botão "Add Jars...".

Imagem

Imagem

Pressione OK. E o Gson já está pronto para uso.

Agora vamos adicionar o Volley ao nosso projeto. Clique com o botão direito do mouse em cima do projeto e vá em propriedades novamente. Vá até o menu a esquerda e selecione a opção "Android". Na sessão Library a direita, clique no botão "add". Selecione o Volley e aperte OK.

Imagem

Imagem

*OBS: Em versões antigas do plugin ADT, para adicionar uma biblioteca desta maneira, a biblioteca e o projeto em questão devem estar no mesmo diretório. (.../workspace/Volley e .../workspace/JSONAPI)

Caso dê algum problema, sugiro dar um clean no Volley e depois no JSONAPI (selecione o projeto, vá ao menu do eclipse/project/clean)

Pronto, nosso projeto já está com as bibliotecas necessárias inclusas. Vamos a contrução da nossa API para comunicação com o servidor. Neste tutorial utilizei o twitter como fonte de dados, sendo assim, a aplicação aqui desenvolvida irá fazer uma busca por uma determinada palavra e receberá os últimos 15 tweets que tem essa palavra.

Exemplo de URL para pesquisar pelo termo "android":
http://search.twitter.com/search.json?q=android

Vamos ao código:
Primeiramente, não esqueça de adicionar a permissão de acesso a internet ao arquivo manifest do projeto:


<uses-permission android:name="android.permission.INTERNET" />
 


Para facilitar, separei as classes em pacotes: adapter, api e model. A figura abaixo mostra uma visão geral de como ficarão os arquivos.

Imagem

Pacote adapter, ficá o adapter da lista que ilustrará os tweets na activity.
Pacote api, terão todas as classes que irão fazer a comunicação com o servidor e nos retornarão os dados já tratados.
Pacote model, contém a classe que é a representação de um tweet.

Começaremos pelo model, ocultei os getters and setters para não ficar tão extenso o código:
model/Tweet.java

package br.com.rafaeldecker.cjws.model;

public class Tweet {

    private String created_at;
    private String from_user;
    private String from_user_id;
    private String from_user_id_str;
    private String from_user_name;
    private String geo;
    private long id;
    private String id_str;
    private String iso_language_code;
    private String profile_image_url;
    private String profile_image_url_https;
    private String source;
    private String text;

    public Tweet(String created_at, String from_user, String from_user_id, String from_user_id_str, String from_user_name, String geo, long id, String id_str,
            String iso_language_code, String profile_image_url, String profile_image_url_https, String source, String text) {

        this.created_at = created_at;
        this.from_user = from_user;
        this.from_user_id = from_user_id;
        this.from_user_id_str = from_user_id_str;
        this.from_user_name = from_user_name;
        this.geo = geo;
        this.id = id;
        this.id_str = id_str;
        this.iso_language_code = iso_language_code;
        this.profile_image_url = profile_image_url;
        this.profile_image_url_https = profile_image_url_https;
        this.source = source;
        this.text = text;
    }
    // getters and setters
 


Agora que já temos nossa representação de tweet, vamos a criação da API de comunicação.

Primeiro passo é criar uma interface, esta interface será responsável pelos call-backs da API.

api/ApiListener.java

package br.com.rafaeldecker.cjws.api;

import java.util.ArrayList;

/**
 * API Listener containing all call-backs to API. Every class that will have an
 * API connection needs to implement this interface.
 *
 * @author Rafael Decker
 *
 */

public interface ApiListener {

    /**
     * Call-back used to show some UI to the user while the server handling the
     * request
     */

    public void onPreExecute();

    /**
     * Call-back used when the request ends. It is called even if some error
     * happens.
     *
     * @param booelan
     *            isSuccess
     * @param ArrayList
     *            <?> parsedData
     */

    public void onRequestEnds(boolean isSuccess, ArrayList<?> parsedData);

}
 

Notamos que temos dois métodos nessa interface:
- onPreExecute(): Esse call-back vai ser chamado pela API antes de fazer a request para o webservice. É neste método que devemos fazer qualquer tratamento anterior a requisição, como por exemplo: criar um dialog de carregando, para informar o usuário que a requisição dele está sendo feita. Segue o mesmo princípio do onPreExecute da classe AsyncTask.
- onRequestEnds(...): Esse call-back irá ser chamado pela API quando a requisição terminou. Note que ele passará alguns parâmetros nessa chamada. O booleano indicando se a requisição foi feita com sucesso. E um array de dados, dados estes que serão parseados do json. Poderíamos também incluir aí uma mensagem de erro, mas acabei não implementando isso.

O segundo passo é criar o core da nossa API, ou seja, a "casca" da API e seus principais métodos. Notem que ela é uma classe abstrata.

api/ApiCore.java

package br.com.rafaeldecker.cjws.api;

import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

import org.json.JSONObject;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import android.app.Activity;

/**
 * Class containing the main API methods to do the request
 *
 * @author Rafael Decker
 *
 */

public abstract class ApiCore {

    /**
     * Base URL.
     */

    public static final String BASE_URL = "http://search.twitter.com";

    /**
     * Context reference
     */

    protected Activity mActivity;

    /**
     * Interface call-backs
     */

    protected ApiListener mApiListener = null;

    /**
     * Constructor
     *
     * @param Activity
     *            activity
     * @param ApiListener
     *            apiListener
     */

    public ApiCore(Activity activity, ApiListener apiListener) {
        this.mActivity = activity;
        this.mApiListener = apiListener;
    }

    /**
     * Method that should be called to trigger a request
     *
     * @param HashMap
     *            <String,String> parameters
     */

    public void doRequest(HashMap<String, String> parameters) {

        // on pre execute call back called before execute the request
        if (mApiListener != null) {
            mApiListener.onPreExecute();
        }

        // Get a request queue instance by using the volley framework
        RequestQueue rq = Volley.newRequestQueue(mActivity);
        // add a new request with a json callback to handle the response
        rq.add(new JsonObjectRequest(getUrl(parameters), null, new Listener<JSONObject>() {

            public void onResponse(JSONObject jsonRoot) {
                // the request ends listener is called by the
                // handleJsonResponse
                // on the subclass
                handleJsonResponse(jsonRoot);
            }
        }, new Response.ErrorListener() {

            public void onErrorResponse(VolleyError error) {
                // Call-back from Volley if something wrong happens. We
                // should call the apiListener call-back
                if (mApiListener != null) {
                    mApiListener.onRequestEnds(false, new ArrayList<Object>());
                }
            }
        }));
    }

    /**
     * Sub class should implement it to deliver the full URL to the request.
     *
     * @param HashMap
     *            <String, String> parameters
     * @return String fullUrl
     */

    public abstract String getUrl(HashMap<String, String> parameters);

    /**
     * Method that will be called to handle the json response from a request
     *
     * @param JSONObject
     *            jsonRoot
     */

    public abstract void handleJsonResponse(JSONObject jsonRoot);

    /**
     * Method used to create the final URL. It inserts parameters on the URL.
     *
     * @param String
     *            baseUrl
     * @param HashMap
     *            <String, String> parameters
     * @return String finalUrl
     */

    protected String createUrl(String baseUrl, HashMap<String, String> parameters) {

        String finalUrl = baseUrl;

        // Inserting the parameters on the url
        if (parameters != null) {
            if (parameters.size() > 0) {
                finalUrl += "?";

                Set<String> keysSet = parameters.keySet();
                int count = 0;
                int nKeys = keysSet.size();
                for (String key : keysSet) {
                    String value = null;
                    try {
                        value = URLEncoder.encode(parameters.get(key), "UTF-8");
                    } catch (Exception e) {
                        value = parameters.get(key);
                    }

                    finalUrl += key + "=" + value;

                    boolean isNotTheLastParameter = (count != nKeys - 1);
                    if (isNotTheLastParameter) {
                        finalUrl += "&";
                    }
                    count++;
                }
            }
        }

        // Used to encode the parameters of the URL, because it may have some
        // special character
        try {
            URL url = new URL(finalUrl);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            url = uri.toURL();
            finalUrl = url.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return finalUrl;
    }
}
 


Vamos começar a explicação pelos atributos:
- BASE_URL: Contém a URL base. Mas por que tu declarou ela separada? Pelo simples motivo de que se o domínio for mudado, apenas pecisamos mudar esta URL e em nenhum lugar mais do código.
- mActivity: Contexto da aplicação. O Volley precisa dele para criar uma request queue.
- mApiListener: Call-back que será chamado.

O método abstrato getUrl é utilizado por subclasses de nossa API (neste tutorial só teremos uma, a SearchApi.java). Por que ele foi criado? Ele foi criado, porque cada subclasse vai ter a sua URL. Vou tentar explicar melhor exemplificando:
Supondo que eu preciso consumir dados de estados e cidades. Tenho um servidor, cuso host é (fictício) : http://www.rafaeldecker.com.br, ou seja, esta é a URL_BASE.
Para consumir os estados, eu preciso acessar a seguinte URL: http://www.rafaeldecker.com.br/estados.json
Para consumir as cidades, eu preciso acessar a seguinte URL: http://www.rafaeldecker.com.br/cidades.json?id=1
Vejam, a base da URL é a mesma, amanhã se eu precisar mudar de domínio, eu preciso alterar somente a URL_BASE, o restante da API segue a mesma coisa.
Neste exemplo, eu teria duas classes distintas para fazer a request e ambas extendem de ApiCore. BuscaEstados.java e BuscaCidades.java (ambas iriam montar a URL de acordo as necessidades delas).

O método abstrato handleJsonResponse é responsavel por "tomar conta" da resposta do servidor, ou seja, cada classe tem o seu jeito de parsear os dados vindos do servidor. Usando o mesmo exemplo anterior, parsear os dados dos estados é diferente de parsear os dados das cidades. Além do parser ser diferente, o retorno é diferente. Os estados retornariam um ArrayList<Estado> enquanto as cidades retornariam um ArrayList<Cidade>, por exemplo.

O método createUrl é responsável pro criar a URL completa, ou seja, BASE_URL + alguma particularidade + parâmetros. Notem que ela recebe um mapa como parâmetro, neste mapa, contém todos os parâmetros da URL. Utilizando o mesmo exemplo das cidades (único parâmetro é id=1 => parameters.put("id","1")), o método getUrl da classe BuscaCidades iria retornar isso: createUrl(ApiCore.BASE_URL + "/cidades.json", parameters). O método createUrl iria retornar a seguinte URL: http://www.rafaeldecker.com.br/cidades.json?id=1
Estes métodos ficarão mais claros quando eu explicar a classe SearchApi.java.

Faltou explicar o método mais importante desta classe, o doRequest, método este que será chamado pela sua activity para fazer a requisição.
Este método recebe como parâmetro um mapa, que são os parâmetros da request. A primeira coisa que o método faz, é verificar se os call-backs foram passados, caso positivo, ele chama o método onPreExecute (para executar o método onPreExecute da classe que instanciou a API).
Depois é criado uma instância de RequestQueue do Volley, este cara é quem irá fazer a request.
Veja que é criado um JsonObjectRequest do Volley, e ele tem dois call-backs:
- onResponse que retorna um objeto json, com a resposta do servidor. Quando esta resposta é recebida, nosso método chama imediatamente o método handleJsonResponse, para que a subclasse possa parseá-lo. O método da subclasse
- onErrorResponse que é chamado caso algum erro ocorra na requisição feita pelo Volley.
Em caso de erro, é chamado o call-back onRequestEnds passando false, ou seja, dizendo que a requisição falhou. Neste ponto, caso alguém ache interessante, pode-se adicionar a mensagem de erro que eu falei quando estava explicando a interface ApiListener.

O terceiro passo é criar uma subclasse de ApiCore, no nosso tutorial, trata-se da classe que será responsável por montar a URL e parsear os dados de uma determinada query do twitter.
api/SearchApi.java

package br.com.rafaeldecker.cjws.api;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONObject;

import com.google.gson.Gson;

import br.com.rafaeldecker.cjws.model.Tweet;

import android.app.Activity;

public class SearchApi extends ApiCore {

    public SearchApi(Activity activity, ApiListener apiListener) {
        super(activity, apiListener);
    }

    @Override
    public String getUrl(HashMap<String, String> parameters) {
        return createUrl(ApiCore.BASE_URL + "/search.json", parameters);
    }

    @Override
    public void handleJsonResponse(JSONObject jsonRoot) {

        ArrayList<Tweet> arrayList = new ArrayList<Tweet>();
        Gson gson = new Gson();
        try {
            JSONArray array = jsonRoot.getJSONArray("results");
            int nObjs = array.length();
            for (int i = 0; i < nObjs; i++) {
                JSONObject object = ((JSONObject) array.getJSONObject(i));

                Tweet tweet = gson.fromJson(object.toString(), Tweet.class);
                arrayList.add(tweet);
            }

            if (mApiListener != null) {
                mApiListener.onRequestEnds(true, arrayList);
            }
        } catch (Exception e) {
            if (mApiListener != null) {
                mApiListener.onRequestEnds(false, arrayList);
            }
        }
    }
}
 


Veja, o método getUrl implementado, pega a URL_BASE e adiciona "/search" e os parâmetros.
O metodo handleJsonResponse é o responsável por parsear os dados...
O array com os dados que serão retornados é criado. Juntamente com uma instância do Gson (biblioteca que irá converter json para objeto).
No final do parser, é retornado o call-back com true, ou seja, os dados foram parseados com sucesso e o array com os Tweets.
Caso ocorra algum erro, devemos retornar false, ou seja, ocorreu algum problema no parser.

Bom, aqui nossa API está pronta. Agora vamos ver como usá-la.
Irei mostrar os resultados do twitter em uma lista, para isto, criei um layout para o adapter da lista:
res/layout/adapter_twitter.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >


   
    <TextView
        android:id="@+id/tweetAdapterUser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#CCC"
        android:textSize="14sp"
        android:text="user" />

   
    <TextView
        android:id="@+id/tweetAdapterMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:textSize="14sp"
        android:text="text" />


</LinearLayout>
 


adapter/TweetAdapter.java

package br.com.rafaeldecker.cjws.adapter;

import java.util.ArrayList;

import br.com.rafaeldecker.cjws.R;
import br.com.rafaeldecker.cjws.model.Tweet;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class TweetAdapter extends BaseAdapter {
   
    private Activity mActivity;
    private ArrayList<Tweet> mData;
   
    public TweetAdapter (Activity activity, ArrayList<Tweet> data) {
        this.mActivity = activity;
        this.mData = data;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int index) {
        return mData.get(index);
    }

    @Override
    public long getItemId(int index) {
       
        return index;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater;
        View view = convertView;

        if (convertView == null) {
            inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.adapter_tweet, null);
        }
       
        TextView user = (TextView) view.findViewById(R.id.tweetAdapterUser);
        user.setText("@" + mData.get(position).getFrom_user());
       
        TextView message = (TextView) view.findViewById(R.id.tweetAdapterMessage);
        message.setText(mData.get(position).getText());
       
       
        return view;
    }

}
 


Nossa activity, que terá um EditText para o usuário colocar a query a ser pesquisada no twitter, um botão para buscar os dados e uma lista pra mostrar os resultados.
res/layout/

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >


        <EditText
            android:id="@+id/searchEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="@string/query_hint" />


        <Button
            android:id="@+id/searchButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="OK" />

    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>
 


MainActivity.java

package br.com.rafaeldecker.cjws;

import java.util.ArrayList;
import java.util.HashMap;

import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import br.com.rafaeldecker.cjws.R;
import br.com.rafaeldecker.cjws.adapter.TweetAdapter;
import br.com.rafaeldecker.cjws.api.ApiListener;
import br.com.rafaeldecker.cjws.api.SearchApi;
import br.com.rafaeldecker.cjws.model.Tweet;

public class MainActivity extends Activity implements OnClickListener, ApiListener {

    private EditText mSearchEditText;
    private Button mSearchButton;
    private ListView mListView;

    private ProgressDialog mProgressDialog;

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

        mSearchEditText = (EditText) findViewById(R.id.searchEditText);
        mSearchButton = (Button) findViewById(R.id.searchButton);
        mListView = (ListView) findViewById(R.id.listView);

        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Loading...");
       
        mSearchButton.setOnClickListener(this);
    }


    @Override
    public void onPreExecute() {
        mProgressDialog.show();
    }

    @Override
    public void onRequestEnds(boolean isSuccess, ArrayList<?> parsedData) {
        mProgressDialog.dismiss();
       
        mListView.setAdapter(new TweetAdapter(this, (ArrayList<Tweet>) parsedData));       
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.searchButton) {
            SearchApi api = new SearchApi(this, this);
            HashMap<String, String> parameters = new HashMap<String, String>();
            String query = mSearchEditText.getText().toString().trim();
            parameters.put("q", query);
            api.doRequest(parameters);
        }
    }

}
 


Nossa activity precisa implementar nossa interface ApiListener, para ter os métodos de call-backs.

No método onCreate é feita as referências para as views do XML e criado um ProgressDialog, este dialog que irá ser mostrado para o usuário enquanto a API está buscando os dados. Ele será mostrado no método onPreExecute.

No método onRequestEnds, receberemos os dados da nossa API, no casso, um ArrayList<Tweet>. Iremos setá-lo a nossa lista.

No click do botão de busca, é criado uma instância da nossa SearchApi.
Criamos também o mapa que terá os parâmetros dessa url, neste exemplo somente a query (q=texto):
Depois de configurar os parâmetros, precisamos fazer a request passando o mapa como parâmetro. Quando a API terminar, o call-back onRequestEnds irá ser chamado.

Resultado:

Imagem

Imagem

Bom pessoal, espero que este tutorial possa ajudar vocês em alguma coisa.

Abraços


Você não tem permissões suficientes para ver os arquivos anexados nesta mensagem.


29 Mai 2013, 10:54
Perfil
Developing Applications
Developing Applications
Avatar de usuário

Data de registro: 30 Dez 2007, 13:08
Mensagens: 548
Localização: Florianópolis - SC
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Muito bom rafael!

_________________
Google

Siga o Portal Android no twitter: @portal_android

- Nunca deixe de compartilhar a solução de algum problema;
- Críticas, dúvidas ou sugestões relacionadas ao Portal Android? Participe do Portal;
- Venda, troca, compra? Classificados;
- Faça uma busca antes de postar, sua dúvida já pode ter sido respondida. Mecanismo de busca 1, Mecanismo de busca 2;
- Não crie tópicos com títulos tipo "AJUDA URGENTE", "IMPORTANTE", "AJUDA POR FAVOR", "ESTOU DESESPERADO", etc...


29 Mai 2013, 12:07
Perfil ICQ WWW
What is a Activity?
What is a Activity?

Data de registro: 27 Out 2011, 17:41
Mensagens: 11
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Olá,

obrigado pelo tutorial, tenho uma dúvida.

Minha activity tem 2 requisições para Api, como tratar isso no onRequestEnds?

Att.


01 Abr 2014, 15:34
Perfil
Google employee
Google employee

Data de registro: 28 Jan 2011, 11:42
Mensagens: 1037
Localização: Rio Grande do Sul
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Olá Hussan

Tu podes modificar a tua interface e adicionar um parâmetro de controle de operação.

Por exemplo:


package br.com.rafaeldecker.cjws.api;

import java.util.ArrayList;

public interface ApiListener {

    public void onPreExecute(int operation);

    public void onRequestEnds(int operation, boolean isSuccess, ArrayList<?> parsedData);

}
 


ApiCore

public void doRequest(final int operation, HashMap<String, String> parameters) {

        // on pre execute call back called before execute the request
        if (mApiListener != null) {
            mApiListener.onPreExecute(operation);
        }

        // Get a request queue instance by using the volley framework
        RequestQueue rq = Volley.newRequestQueue(mActivity);
        // add a new request with a json callback to handle the response
        rq.add(new JsonObjectRequest(getUrl(parameters), null, new Listener<JSONObject>() {

            public void onResponse(JSONObject jsonRoot) {
                // the request ends listener is called by the
                // handleJsonResponse
                // on the subclass
                handleJsonResponse(operation, jsonRoot);
            }
        }, new Response.ErrorListener() {

            public void onErrorResponse(VolleyError error) {
                // Call-back from Volley if something wrong happens. We
                // should call the apiListener call-back
                if (mApiListener != null) {
                    mApiListener.onRequestEnds(operation, false, new ArrayList<Object>());
                }
            }
        }));
    }

  public abstract void handleJsonResponse(int operation, JSONObject jsonRoot);
 


Obs: Não esqueça de modificar tua subclasse da ApiCore (nesse exemplo, a SearchApi).

Pra fazer a request


public static final int OPERATION_ONE = 1;
public static final int OPERATION_TWO = 2;

...

api.doRequest(OPERATION_ONE, parameters);

 


Nos teus callbacks tu irás receber a operação passada no doRequest, e com base nessa operação, tu trata o resultado.

Abraço


02 Abr 2014, 00:14
Perfil
What is a Activity?
What is a Activity?

Data de registro: 27 Out 2011, 17:41
Mensagens: 11
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Olá,

bacana, tinha pensando em algo por ai. Vou tentar, e muito obrigado.

Att.


02 Abr 2014, 01:57
Perfil
What is a Activity?
What is a Activity?

Data de registro: 27 Out 2011, 17:41
Mensagens: 11
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Olá,

perfeito, funcionando. Valeu!

Att.


02 Abr 2014, 02:35
Perfil
What is Android?
What is Android?

Data de registro: 14 Mai 2014, 11:10
Mensagens: 2
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Muito bom o tutorial, parabéns.

Estou alterando um projeto que tenho onde utilizo as requisições com HttpURLConnection,
porém encontri um dificuldade no volley relacionado aos parâmetros enviados via Header na request.

Como meu sistema possui um sistema de segurança baseado em Token eu preciso enviar esse cara como um dos atributos no head.

Como posso incluir esse tipo de atributo na requisição com volley?


25 Jul 2014, 19:15
Perfil
Android Man
Android Man

Data de registro: 23 Abr 2012, 17:32
Mensagens: 917
Localização: Joinville - SC
Mensagem Re: Consumindo JSON usando Volley Framework + Google Gson
Eu tenho uma dúvida, não sei se alguem ja passou por isso
olha só,
e SE no retorno do WS, eu quiser retornar uma classe genérica, onde nessa classe eu retorno assim

public class genericReturn
boolean success
String errorMessage
T returnMethod


ja tentaram isso?
nao consegui fazer isso, alguem sabe uma solucao? alem de colocar o success e o errormessage pra todos os meus retornos?
valeu

_________________
RaFael
Formação : Bacharel em ciência da computação - UNISUL
rafaelreinaldoduarte@gmail.com - Gtalk
Celular : NEXUS 5
Programador Android, JavaSE, Arduino.


06 Out 2014, 18:40
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 8 Mensagens ] 

Quem está online

Usuários vendo este fórum: ac0502, Aderbal Nunes, Adriano, agtavares, Alex Marcelo Burnett, Alexandre de Queiroz, alsimoes, andi, andreluzz, attomweb, Avelino Mateus Neto, beeshop, billsombrio, BMaia, brcamp, brpiassa, brunomalka, Bruto_JPO, BTalhadas, cabelo, careisjr, cassianotartari, Catapan, cenatech, Chanceler Supremo Finis Valorum, christian, chunga, Comandante Cody, comolatti, DaDih*, Damiani Oliveira, Daniel Batista, Deiapinh, Diego Otani, diogeneskelsen, Dudi_FC, Eliezer Reis, Emanuella, estratecnologia, euguns, eXagon, fabricioLeonard, Felipe Ferreira, felipetesc, fernandofsf, Flavio Alves, frances135, francismarconcini, furlanrapha, geovanebg, glmsistemas, grandebaro, hopper.frf, hostdesigner, hugomarinho, IgorBrum, ismavolk, italoraony, jacard, Jar Jar Binks, Javanês, jorgeFernandes, Josinhaz, José Guilherme, juliancesar, juliomar, kennedyximenes, klausenner, kleberperea, lalaine, Leonardo, LucasNascimento, luizcarlosvb, luizcesar, marceloaragao, marcelochiquinho, marcow, marinho5, maurosilva, mikasjau, monteirojp, mrangel, n3t0, oliveiramc, On_7, paint-horse, paulokiller, peterson.bah, pjorge, rafael.winter, rafaelvital, renatocoliveira, rogeriopgomes, romualdo, ronanPlus, rotmeil, rtodao, Shaman286, SidneiCP, sobrinho, srmoreira, suportecr, taluna, talves, Thelemita, tiagoxv, Vector, vps_rj, wagner_francisco, WiseNut, Wryel, yuri82 e 2 visitantes


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi