2014-09-05 2 views
0

안녕하세요 여러분, 다른 스레드에서 listview를 업데이트하려고하면 nullpointerexception이 발생합니다. 필자는 주 활동에 대해이 작업을 수행 할 수 있지만 다른 클래스 스레드의 listview 업데이트를 원한다. 나는 무엇을 잘못하고 있는지 궁금해했고, 내가 바라 보는 뭔가가 될 수 있을까? 여기에 코드가 있습니다. 지저분한 코드를 사용해 죄송합니다. 여기 몇 시간 동안 서버 클래스가 있습니다. 나는 내가 시도한 모든 것을 기억하지 못하는 많은 다른 것들을 시도했다.notifydatasetchanged는 null을 반환합니다.

서버 :

ServerGUI 무엇
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

? 기본 UI 스레드에서 UI 업데이트를 수행해야합니다. 몇 가지 예를 보려면 설명서를 참조하십시오. Communicating with the UI Thread.

+0

ServerGUI 방금 주 활동으로 이름을 지정했습니다. – andyADD

+0

왜 새 활동()을 부르시겠습니까? 다른 활동에서 활동에 대한 참조를 얻어야합니다. – Chris

+0

을 의미하는 경우 ServerGUI gui; 왜냐하면 나는 ServerGUI를 사용할 때 "내포 된 클래스가 아닙니다"라는 메시지를 내게 던지기 때문입니다. – andyADD

관련 문제