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

SharedPreference + Http Request

Boa noite. Já estou um pouco avançado no desenvolvimento Android, e por isso acho que a minha pergunta seja um pouco complicada (e confusa...). Mas espero que algum instrutor ou aluno consiga me ajudar. :)

Seguinte, estou trabalhando em um aplicativo, que eu tenho um HTTP request, que eu chamo em um Service. Mas meu problema é que a Url usada é definida pelo usuário em um EditText dentro do Fragment(que não é o fragment principal da minha app). Estou salvando o texto do campo com o SharedPreference, e referencio ele à uma String. Depois disso o request funciona normalmente. Porém, uma vez que o meu fragment morre, ou a minha app fecha, ao retomar o service eu tenho um NullPointer na url. No meu service, eu chamo o http request da seguinte maneira:

HttpConnection.getSetDataWeb(Fragment2.Url);

Oque eu gostaria de fazer é, uma vez que eu entrar no meu Fragment2 e salvar essa url, ela fique salva na minha app e eu possa usar ela mesmo depois que a app for reiniciada.

Enfim, espero ter explicado o melhor possível, e que alguém consiga me ajudar.. :)

Valeu! ;)

6 respostas

Oi Cláudio, tudo bem?

Conforme você mesmo mencionou o SharedPreferences permite salvar dados primitivos sendo que eles ficam persistidos na sua App.

Em outras palavras, basta apenas você salvar a URL que você deseja pegar no SharedPreferences, e então, você recupera a mesma URL a partir do uso do SharedPreferences. Ele funciona como um banco de dados da sua aplicação, a única diferença é que você armazena valores primitivos, Strings, int, boolean...

Caso tiver dúvida como usar o SharedPreferences eu posso montar um exemplo.

Abraços.

Olá! Então, eu já estou salvando os dados do meu campo com o SharedPreferences, e referencio a String url para o campo:

url = editTextUrl.getText.toString;

Porém quando o frangment onde está esse EditText não é inicializado, o App retorna co um erro como se o campo estivesse null, e por isso a variável Fragment2.url também.

Oque não estou conseguindo é fazer com que esse valor da String fique guardado..

Valeu!

Se puder mandar todo o código que você está usando para salvar e recuperar os dados no SharedPreferences eu consigo verificar de uma forma mais fácil o problema.

Então. Esse é o meu fragment2 onde eu seto a url no Edit Text:

public class Fragment2 extends Fragment {

    public static String url;
    public static EditText url_field;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState){
        View view = inflater.inflate(R.layout.settings_frag_layout,container,false);


        url_field = (EditText) view.findViewById(R.id.field_url);

        //SHARED PREFERENCES FIELDS
        SharedPreferences urlPreferences = getContext().getSharedPreferences("url_key", Context.MODE_PRIVATE);
        url_field.setText(urlPreferences.getString("url_key", ""));



        //SHARED PREFERENCES OBJECTS
        SharedPreferences objUrlPreferences = getContext().getSharedPreferences("objUrl_key", Context.MODE_PRIVATE);
        url = objUrlPreferences.getString("objUrl_key" , "");


        //Set Save Button
        Button saveButton = (Button) view.findViewById(R.id.btn_save);
        saveButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {


                //Update SHARED PREFERENCES FIELDS
                SharedPreferences.Editor editorUrl = getContext().getSharedPreferences("url_key", MODE_PRIVATE).edit();
                editorUrl.putString("url_key", url_field.getText().toString());
                editorUrl.commit();


                url = url_field.getText().toString();


                //Update SHARED PREFERENCES obj
                SharedPreferences.Editor objUrlEditor = getContext().getSharedPreferences("objUrl_key", MODE_PRIVATE).edit();
                objUrlEditor.putString("objUrl_key", url);


                Toast toast = Toast.makeText(getContext(), "Configurações Salvas", Toast.LENGTH_SHORT);
                toast.show();

            }
        });

 return view;
    }
}

Esse é a parte onde eu chamo o http request no Service :

public int onStartCommand(Intent intent, int flag, int startId){

    HttpConnection.getSetDataWeb(Fragment2.url);

     return super.onStartCommand(intent, flag, startId);

}

E esse é o Fragment principal da minha app onde eu ativo o service:

 public View onCreateView { [.....]

     }

      Button startService = (Button) view.findViewById(R.id.btn_start);
        startService.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {

                getActivity().startService(new Intent(getActivity(),myService.class));

   }
}
solução!

Oi Cláudio, vendo o seu código eu sugiro que você evite pegar a URL por meio do atributo do fragment, pois você vai estar sempre dependendo dele para que a requisição funcione. Em outras palavras, tente pegar diretamente do SharedPreferences, afinal, mesmo que você não crie o seu fragment o valor vai ser o mesmo, pois ele está persistido e acessível para toda a sua aplicação, colocando as minhas palavras em código seria:

public int onStartCommand(Intent intent, int flag, int startId){

    SharedPreferences urlPreferences = getContext().getSharedPreferences("url_key", Context.MODE_PRIVATE);
    String url = urlPreferences.getString("url_key", "");

    HttpConnection.getSetDataWeb(url);

    return super.onStartCommand(intent, flag, startId);

}

Veja que dessa forma, basta apenas o você salvar a URL no SharedPreferences por meio dessa chave que você terá acesso à URL, mesmo que o seu serviço seja executado em background, isto é, sem nenhuma tela criada.

Abraços.

Consegui fazer dessa forma. Muito Obrigado!! :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software