2014-09-05 34 views
0

嘿,我試圖從另一個線程更新列表視圖時,我得到一個nullpointerexception。我能夠在我的主要活動中做到這一點,但我想從另一個類的線程更新列表視圖,我想知道我做錯了什麼,可能是我忽略的東西?這是代碼。對不起,亂碼,我一直在這裏幾個小時這裏是服務器類。我嘗試了很多不同的東西,我不記得我嘗試過的一切。notifydatasetchanged返回null

服務器:

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(); 



    } 


} 

回答

0

什麼是ServerGUI?您需要在主UI線程上進行UI更新。有關示例,請參閱文檔:Communicating with the UI Thread

+0

ServerGUI我剛剛命名爲mainactivity – andyADD 2014-09-05 17:53:15

+0

爲什麼要調用'new Activity()'呢?你應該從別的東西那裏得到對活動的引用。 – Chris 2014-09-05 18:01:46

+0

如果你的意思是ServerGUI gui;是因爲當我使用ServerGUI時,我得到「不是一個封閉的類」拋給我。 – andyADD 2014-09-05 18:05:43