Ich mache Chat-Anwendung mit Android und Socket. Die Chat-Schnittstelle befindet sich im Fragment. Während beide Geräte Chat-Schnittstelle zeigen, läuft es gut. Aber wenn eines der Geräte schließt, gibt es mir eine Fehlermeldung nahe.Fragment Listener funktioniert nicht, wenn Aktivität zerstört wird
Hier ist mein Code. MainActivity.java
public class MainActivity extends AppCompatActivity {
private FragmentManager manager;
private android.support.v4.app.FragmentTransaction transaction;
private Socket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
manager = getSupportFragmentManager();
transaction = manager.beginTransaction();
chatFragment enter = new chatFragment();
transaction.add(R.id.fragmentContainer, enter);
transaction.commit();
}
}
}
und ChatFragment.java
public class ChatFragment extends Fragment {
private ListView listchat;
private Button send;
private EditText msgText;
public ChatAdapter adapter;
private ArrayList<ChatModel> items = new ArrayList<ChatModel>();
private boolean isactive;
private Toolbar chatToolbar;
private FragmentManager manager;
private FragmentTransaction transaction;
private Socket socket;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View v;
v = inflater.inflate(R.layout.chat_fragment, container, false);
SocketSingleton singleton = (SocketSingleton) getActivity().getApplication();
socket = singleton.getmSocket();
// this is listener for message coming
socket.on("message", messageListener);
msgText = (EditText) v.findViewById(R.id.editMsg);
adapter = new ChatAdapter(getActivity(), R.layout.chat_list, items);
listchat = (ListView) v.findViewById(R.id.listchat);
listchat.setAdapter(adapter);
listchat.setDivider(null);
send = (Button) v.findViewById(R.id.btnSend);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addMessage();
}
});
return v;
}
private void addMessage() {
ChatModel item = new ChatModel();
item.setMsg(msgText.getText().toString());
items.add(item);
adapter.notifyDataSetChanged();
String message = msgText.getText().toString();
socket.emit("message", message);
msgText.setText("");
}
private Emitter.Listener messageListener = new Emitter.Listener() {
@Override
public void call(final Object... args) {
// error start from here
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject json = (JSONObject) args[0];
String msg;
try {
msg = json.getString("message").toString();
ChatModel model = new ChatModel();
model.setMsg(msg);
items.add(model);
adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
};
}
In longcat sagt er.
FATAL EXCEPTION: EventThread
java.lang.NullPointerException
in Anwendung, erzwingen Schließen, wenn Nachricht kommt und Aktivität schließen. Wie wird mit diesem Listener verfahren, wenn eine Nachricht eingeht und die Aktivität geschlossen wird? Vielen Dank.
Mögliches Duplikat [Was eine Null-Zeiger-Ausnahme ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception- und-wie-mache-ich-fix-it) – aribeiro