java.lang.ClassCastException:java.lang.Object []无法强制转换为

时间:2018-05-10 10:27:08

标签: android android-asynctask

我正在尝试使用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)

这是我的角色类(我要发送的对象):

 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 :(得分:2)

而不是使用

AsyncTask myATaskYW;

使用

MyATaskCliente myATaskYW;

因为AsyncTask是通用的,所以签名被Object[]数组替换,但您需要使用特定的实现。

注意:Person[]不是Object[]

的孩子