简体   繁体   English

当Activity被销毁时,片段监听器不起作用

[英]Fragment Listener doesn't works when Activity is destroyed

I make chat application with android and socket. 我用Android和套接字制作聊天应用程序。 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 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 和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. 谢谢。

You have to set messageListener to null in onDetach() of your fragment. 您必须在片段的onDetach()中将messageListener设置为null

@Override
    public void onDetach() {
        super.onDetach();
        messageListener = null;
    }

You should check for getActivity() first . 您应该先检查getActivity()

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();
                    }

                }
            });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用片段销毁活动 - Activity destroyed using Fragment 覆盖片段内的活动工具栏(并在片段被销毁时恢复) - Override the activity toolbar inside a fragment (and restore when the fragment is destroyed) 在 Android 上,是否有必要在活动被破坏时移除传感器侦听器? - On Android, is it necessary to remove a sensor listener when an activity is destroyed? 在主活动中覆盖片段时,输入无法按预期工作 - Input Doesn't Work as Expected When Overlaying a Fragment in Main activity 添加片段时,活动布局不会更改 - Activity layout doesn't change when a fragment is added 片段未显示在Mainactivity中,在我的活动片段内容仅在我单击工具栏时显示 - Fragment doesn't show in Mainactivity, In my activity fragment content only show when I click on toolbar 自定义监听器/界面在Android中不起作用 - Custom listener/interface doesn't works in Android 活动销毁后,自定义Listview不响应侦听器 - Custom Listview not responding to listener after activity destroyed Java代码在片段活动中不起作用 - java code doesn't work in fragment activity 仅当按下Enter键时,按键侦听器才起作用。 对于其他键不起作用 - Key listener only works when the Enter key is pressed. Doesn't work for other keys
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM