notifydatasetchanged返回null

时间:2014-09-05 17:35:42

标签: java android android-listview

当我尝试从另一个线程更新listview时,我得到了nullpointerexception。我能够在我的主要活动中做到这一点,但是我想从另一个类线程更新listview,我想知道我做错了什么,可能是我忽略的东西吗?这是代码。对不起凌乱的代码,我已经在这里工作了几个小时这里是服务器类。我尝试了很多不同的事情,我不记得我尝试过的一切。

服务器:

public class Server extends Thread{

    private ServerSocket serverSocket;
    private ServerGUI gui;
    Context context;
    private Server s;
    ArrayList<String> addclientlist;
    private ListView listview;
    private ArrayAdapter<String> adapter;
    String inforeceive;




    public Server(Context context){
        this.context=context;
        gui = new ServerGUI();
        listview = (ListView) ((Activity)context).findViewById(R.id.list);




    }

    @Override
    public void run() {

        gui.runOnUiThread(new Runnable(){

            @Override
            public void run() {
                try{

                    int port = 8000;
                    serverSocket = new ServerSocket(port);
                    TextView listport = (TextView)((Activity)context).findViewById(R.id.textViewportlisten);
                    listport.setText("Listening On Port: "+serverSocket.getLocalPort());

                    addclientlist = new ArrayList<String>();
                    adapter = new ArrayAdapter<String>(gui,
                            android.R.layout.simple_list_item_1, android.R.id.text1, addclientlist);
                    listview.setAdapter(adapter);




                }catch(Exception e){

                }
                setOnline();




            }
        });

        super.run();
    }




    public void setOnline(){

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


                    while(true){

                        final Socket cs = serverSocket.accept();

                        final DataInputStream dis = new DataInputStream(cs.getInputStream());

                        gui.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                try {


                                    final EditText logtext = (EditText) ((Activity) context).findViewById(R.id.editTextlog);
                                    logtext.append("New client from: " + cs.getInetAddress() + "\n");

                                    new AsyncTask<Void,Void,Void>(){
                                        @Override
                                        protected Void doInBackground(Void... params) {
                                            return null;
                                        }

                                        @Override


                                        protected void onPostExecute(Void aVoid) {
                                            try{
                                                adapter.add(dis.readUTF().toString());
                                                adapter.notifyDataSetChanged();
                                                dis.close();
                                            }catch(Exception e){
                                                logtext.append(e.toString()+"\n");
                                            }
                                            super.onPostExecute(aVoid);
                                        }
                                    }.execute();
                                } catch (Exception e) {

                                }
                            }
                        });


                    }

                }catch(IOException e){

                }
            }
        }).start();



    }


}

1 个答案:

答案 0 :(得分:0)

什么是ServerGUI?您需要在主UI线程上进行UI更新。有关示例,请参阅文档:Communicating with the UI Thread