Ir ao conteúdo
  • Cadastre-se

Erro no buffer no Android


Posts recomendados

Olá, estou desenvolvendo um aplicativo para Android através do Android Studio, que acessa os dados de um banco de dados através de um web service por meio de protocolo Http, porém está dando o seguinte erro: "E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9b167e0". Já pesquisei sobre e o que achei é que esse erro só foi arrumado na versão 6.0.1 do Android e eu uso o 4.0 e não quero trocar pois a minha versão abrange 100% dos usuários de Android, creio que esse erro seja causado pelo BufferedReader por isso queria saber se não existe uma outra maneira de fazer a leitura da resposta do web service sem usa-lo? Vou deixar uma de minhas classes que usa o BufferedReader para acessar os dados da resposta a seguir para que vocês possam compreender como funciona a requisição.

 

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import danielhermenegildogimenez.contatos.WebService.acessoWS;

/**
 * Created by Daniel on 15/07/2017.
 */
public class Inserir extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {
        boolean resultado = false;
        try {
            String USER_AGENT = "\"Mozilla/5.0\"";
            String url = String.format("http://192.168.100.8:8080/ContatosWS/webresources/Contato/Contato/get/inserir/%s/%s/%s/%s", params[0], params[1], params[2], params[3]);
            
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();

            // optional default is GET
            con.setRequestMethod("GET");

            //add request header
            con.setRequestProperty("User-Agent", USER_AGENT);

            int responseCode = con.getResponseCode();

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            String resposta = response.toString();
            if(resposta == "true") resultado = true;
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("INSERIR", e.toString());
        }
        return resultado;
    }
}

 

Link para o comentário
Compartilhar em outros sites

@D4ni31 Bom dia

 

Olha, eu procurei infos sobre isso mas pode ou não ser algo relacionado a versão do Android e as soluções divergem demais.

 

Já tentou alterar, apenas para fins de teste, a versão do Android para pelo menos 6.0.1 e executar para ver se o erro persiste?

 

Uma das dicas que li foi atualizar o Android, mas teve gente que fez e o erro persistiu, portanto, pode ser qualquer outra coisa.

 

Infelizmente não tenho a resposta para o problema, mas uma busca rápida sobre o erro no StackOverflow mostrou uma boa gama de possíveis soluções.

 

Caso encontre algo mais substancial eu volto a postar de novo.

 

Boa sorte.

Link para o comentário
Compartilhar em outros sites

Olá,

 

Não sei a relação do erro com seu código. Eu fiz e uso um código semelhante ao seu em uns 4 apps e não tenho problemas. Então, acho que o erro é outra coisa. Duvido muito que seja o BufferedReader, pois a implementação dele era em Java. Mas de toda forma, abaixo tem outra abordagem.

 

Faça alguns testes:

 

- Se você não precisa explicitamente de definir o User-Agent, remova o código que o define;

- Informe o sistema que você irá ler a resposta, colocando antes de conectar: con.setDoInput(true);

- Após configurar a request, use o método connect: con.connect();

- Verifique se você adicionou as permissões para acesso à internet;

- Mais uma coisa: como você está chamando a AsyncTask? Se tiver iniciando errado, a partir da UI Thread, o Android não irá permitir algumas ações.

 

Outra coisa, eu iria dizer para não usar StringBuffer onde pode usar StringBuilder.

StringBuffer use somente quando o objeto for acessado por mais de uma thread. StringBuilder é mais simples e tem a mesma função, só não é thread safe. No seu caso, não precisa se preocupar, apenas a thread do async acessa, então use StringBuilder.

 

Mas eu olhei o código que vi que está usando um monte de coisa para fazer pouca coisa! Primeiro, lendo linha a linha e depois concatenando no StringBuffer, você está removendo a quebra de linha... e depois, está criando objetos que não preicsa, como Strings. Além do mais, defina um charset esperado no reader, ou ficará dependente da máquina e pode dar problemas em situações específicas (lembro que um app meu deu pau no Japão).

 

Um jeito mais simples (ou melhor, mais econômico), é:

Reader in = new InputStreamReader(con.getInputStream() /*, sugiro colocar um charset aqui! */);
StringBuffer response = new StringBuffer();
char[] buf = new char[32];
int len = 0;
while((len = in.read(buf)) >= 0) {
    response.append(buf, 0, len);
}
in.close();

String resposta = response.toString();

 

Acho que isso já vai resolver o problema. Provavelmente é o setDoInput(true)...

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!