Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
D4ni31

Erro no buffer no Android

Recommended Posts

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;
    }
}

 

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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)...

 

Editado por brunohpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×