1
resposta

E/AndroidRuntime: FATAL EXCEPTION: main

Estou com o erro abaixo. Já fiz 2 checagem do código e não parece haver nada de errado em relação ao curso. Vi uma possível solução no forum para utilizar optInt(variavel) mas não obtive sucesso.

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.androidera.silvanioduartedacruz.aplicativochat, PID: 5007
                  java.lang.UnsupportedOperationException
                      at java.util.AbstractList.add(AbstractList.java:404)
                      at java.util.AbstractList.add(AbstractList.java:425)
                      at com.androidera.silvanioduartedacruz.aplicativochat.activity.MainActivity.colocaNaList(MainActivity.java:57)
                      at com.androidera.silvanioduartedacruz.aplicativochat.service.ChatService$2$1.run(ChatService.java:107)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5221)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

ChatService

package com.androidera.silvanioduartedacruz.aplicativochat.service;

import com.androidera.silvanioduartedacruz.aplicativochat.activity.MainActivity;
import com.androidera.silvanioduartedacruz.aplicativochat.modelo.Mensagem;

import org.json.JSONObject;
import org.json.JSONStringer;

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

/**
 * Created by silvanioduartedacruz on 04/03/17.
 */
public class ChatService {

    private MainActivity activity;

    public ChatService(MainActivity activity){
        this.activity = activity;
    }

    public void enviarMensagens(final Mensagem mensagem) {

        new Thread(new Runnable() {
            @Override
            public void run() {

                String texto = mensagem.getTexto();

                try {

                    URL url = new URL("http://192.168.1.5:8080/polling");

                    HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();

                    httpConnection.setRequestMethod("POST");

                    httpConnection.setRequestProperty("content-type", "application/json");

                    JSONStringer json = new JSONStringer()
                            .object()
                            .key("text")
                            .value(texto)
                            .key("id")
                            .value(mensagem.getId())
                            .endObject();

                    OutputStream saida = httpConnection.getOutputStream();
                    PrintStream ps = new PrintStream(saida);

                    ps.println(json.toString());

                    httpConnection.connect();
                    httpConnection.getInputStream();

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();

    }


    public void ouvirMensagem() {

        new Thread(new Runnable() {
            @Override
            public void run() {

                try {

                    URL url = new URL("http://192.168.1.5:8080/polling");

                    HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();

                    httpConnection.setRequestMethod("GET");

                    httpConnection.setRequestProperty("Accept", "application/json");

                    httpConnection.connect();

                    Scanner scanner = new Scanner(httpConnection.getInputStream());

                    StringBuilder builder = new StringBuilder();

                    while (scanner.hasNextLine()) {

                        builder.append(scanner.nextLine());

                    }

                    String json = builder.toString();

                    JSONObject jsonObject = new JSONObject(json);

                    final Mensagem mensagem = new Mensagem(jsonObject.optInt("id"), jsonObject.optString("text"));

                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            activity.colocaNaList(mensagem);
                        }
                    });

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();

    }
}

MainActivity

package com.androidera.silvanioduartedacruz.aplicativochat.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.androidera.silvanioduartedacruz.aplicativochat.R;
import com.androidera.silvanioduartedacruz.aplicativochat.adapter.MensagemAdapter;
import com.androidera.silvanioduartedacruz.aplicativochat.modelo.Mensagem;
import com.androidera.silvanioduartedacruz.aplicativochat.service.ChatService;

import java.util.Arrays;
import java.util.List;

import static android.R.attr.button;

public class MainActivity extends AppCompatActivity {

    private int idDoCliente = 1;
    private Button button;
    private EditText editText;
    private ListView listaDeMensagens;
    private List<Mensagem> mensagens;
    private ChatService chatService;

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

        listaDeMensagens = (ListView) findViewById(R.id.lv_mensagens);

        mensagens = Arrays.asList(new Mensagem(1,"Olá alunos de Android"), new Mensagem(2,"Oi"));
        MensagemAdapter adapter = new MensagemAdapter(idDoCliente, mensagens, this);

        listaDeMensagens.setAdapter(adapter);

        button = (Button) findViewById(R.id.btn_enviar);
        editText = (EditText) findViewById(R.id.et_text);

        chatService = new ChatService(this);
        chatService.ouvirMensagem();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chatService.enviarMensagens(new Mensagem(idDoCliente, editText.getText().toString()));
            }
        });
    }

    public void colocaNaList(Mensagem mensagem){

        mensagens.add(mensagem);

        MensagemAdapter adapter = new MensagemAdapter(idDoCliente, mensagens, this);

        listaDeMensagens.setAdapter(adapter);

        chatService.ouvirMensagem();

    }
}

MensagemAdapter

package com.androidera.silvanioduartedacruz.aplicativochat.adapter;

import android.app.Activity;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.androidera.silvanioduartedacruz.aplicativochat.R;
import com.androidera.silvanioduartedacruz.aplicativochat.modelo.Mensagem;

import java.util.List;

/**
 * Created by silvanioduartedacruz on 03/03/17.
 */

public class MensagemAdapter extends BaseAdapter {

    private Activity activity;
    private List<Mensagem> mensagens;
    private int idDoCliente;

    //Construtor
    public MensagemAdapter(int idDoCliente, List<Mensagem> mensagens, Activity activity){

        this.mensagens = mensagens;
        this.activity = activity;
        this.idDoCliente = idDoCliente;

    }

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

    @Override
    public Object getItem(int i) {
        return mensagens.get(i);
    }

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

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {

        View linha = activity.getLayoutInflater().inflate(R.layout.mensagem,viewGroup, false);
        TextView texto = (TextView) linha.findViewById(R.id.tv_texto);

        Mensagem mensagem = (Mensagem) getItem(i);

        if(idDoCliente != mensagem.getId()){

            linha.setBackgroundColor(Color.CYAN);

        }

        texto.setText(mensagem.getTexto());

        return linha;

    }
}

Mensagem

package com.androidera.silvanioduartedacruz.aplicativochat.modelo;

/**
 * Created by silvanioduartedacruz on 03/03/17.
 */
public class Mensagem {

    private String texto;
    private Integer id;

    public Mensagem(int id, String texto) {

        this.id = id;
        this.texto = texto;
    }

    public String getTexto() {

        return texto;
    }

    public int getId() {

        return id;
    }
}
1 resposta

O Arrays.asList é muito útil, mas a lista resultante é de tamanho fixo e não pode ser manipulada com add/remove. Isso é porque a Lista criada é apenas uma "view" do array-argumento.

Na MainActivity, inicialize a List do jeito tradicional:

mensagens = new ArrayList<>();

Pode remover aquelas mensagens de exemplo que nas lições seguintes você vai popular a lista com mensagens digitadas.