当我尝试从另一个线程更新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();
}
}