I make chat application with android and socket. Chat interface is inside the fragment. While both device show chat interface, it runs well. But when one of device close, it give me error force close.
Here is my 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();
}
}
}
and 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 it says.
FATAL EXCEPTION: EventThread
java.lang.NullPointerException
in application, it force close when message is coming and activity close. How to handle this listener when message is coming, and activity close? Thanks.