java.lang.ClassCastException: java.lang.Object [] не может быть приведен к - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь отправить Объект через Сокеты, используя AsyncTask, но я получаю эту ошибку (я просто опубликовал важную часть):

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                      Process: com.mitorapps.beberconmemes, PID: 6418
                      java.lang.RuntimeException: An error occurred while executing doInBackground()



   Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.mitorapps.beberconmemes.data.Persona[]
at com.mitorapps.beberconmemes.conexion.Enviar_Persona$MyATaskCliente.doInBackground(Enviar_Persona.java:47)

Это мой Класс Persona (Объектчто я хочу отправить):

 package com.mitorapps.beberconmemes.data;

    import java.io.Serializable;

    public class Persona implements Serializable{
        private String Name_Persona;
        String Mac_Address;

        public Persona(String name_persona, String mac_address) {
            this.Name_Persona = name_persona;
            this.Mac_Address = mac_address;
        }   

        public String getMac_Address() {
            return this.Mac_Address;
        }

        public String getName_Persona() {
            return this.Name_Persona;
        }

        public void setName_Persona(String name_Persona) {
            this.Name_Persona = name_Persona;
        }
    }

Это мой клиентский класс (названный Enviar_persona):

 package com.mitorapps.beberconmemes.conexion;    

    public class Enviar_Persona extends Cliente{
        private AsyncTask myATaskYW;
        public Enviar_Persona(Context context){
            super(context);//the client class forces to receive a context
            SERVERPORT=5000;
        }
        @Override
        public void enviar_persona(Persona p){//Method Called from view
            this.myATaskYW = new MyATaskCliente();
            this.myATaskYW.execute(p);
        }
        public void update_view(String s){//To update the State of an element on UI
            TextView resp = (TextView) ((Activity)c).findViewById(R.id.resp);
            resp.setText(s);

        }
        //AsyncTask class
        class MyATaskCliente extends AsyncTask<Persona, Void, String> {

            ProgressDialog progressDialog;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                System.out.println("OnPreExecute");
                progressDialog = new ProgressDialog(c);
                progressDialog.setCanceledOnTouchOutside(false);
                progressDialog.setTitle("Connecting to server");
                progressDialog.setMessage("Please wait...");
                progressDialog.show();
            }
            @Override
            protected String doInBackground(Persona... persona) {
                try {
                    //here i'm using an static ip
                    Socket socket = new Socket("192.168.1.7", SERVERPORT);
                    //Object Send to server
                    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
                    output.writeObject(persona[0]);
                    //Response recivied from server
                    InputStream stream = socket.getInputStream();    
                    byte[] len=new byte[256];
                    stream.read(len,0,256);
                    String received = new String(len,"UTF-8");
                    socket.close();
                    return received;

                } catch (UnknownHostException ex) {
                    return ex.getMessage();
                } catch (IOException ex) {
                    return ex.getMessage();
                }

            }

            @Override
            protected void onPostExecute(String value) {
                progressDialog.dismiss();
                update_view(value);
            }
        }
    }

Я сделал это с помощью AsyncTask на основной деятельности, и он работает отлично, но теперь, когда мне нужно сгруппировать код в разные классы, я получил ошибку

1 Ответ

0 голосов
/ 10 мая 2018

Вместо использования

AsyncTask myATaskYW;

использовать

MyATaskCliente myATaskYW;

потому что AsyncTask является общим, поэтому подпись заменяется массивом Object[], но вам нужно работать с конкретной реализацией.

Примечание: Person[] не является потомком Object[]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...