0

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.

user1001
  • 18
  • 6
imma hanitya
  • 33
  • 1
  • 9
  • Possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – António Ribeiro Mar 25 '16 at 00:30

2 Answers2

0

You have to set messageListener to null in onDetach() of your fragment.

@Override
    public void onDetach() {
        super.onDetach();
        messageListener = null;
    }
Shadab Ansari
  • 7,022
  • 2
  • 27
  • 45
0

You should check for getActivity() first .

if( getActivity() != null ){
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();
                    }

                }
            });
}
user1001
  • 18
  • 6