2016-03-24 20 views
0

私はアンドロイドとソケットでチャットアプリケーションを作成します。チャットインターフェースはフラグメント内にあります。どちらのデバイスもチャットインターフェイスを表示していますが、うまく動作します。しかし、デバイスのいずれかが閉じると、それは私にエラー強制を近づける。アクティビティが破棄されたときにフラグメントリスナは機能しません

ここに私のコードです。 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(); 
     } 
    } 

} 

とChatFragment.java longcatで

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

       } 
      }); 
     } 
    }; 

} 

それは述べています。

FATAL EXCEPTION: EventThread 
java.lang.NullPointerException 

アプリケーションでは、メッセージが来てアクティビティが閉じると強制的に閉じます。メッセージが来て、アクティビティーが閉じたときにこのリスナーを処理する方法は?ありがとう。

+0

[NULLポインタ例外であり、私はそれをどのように修正すればよいか?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-の可能性のある重複やっちゃいますよ〜修正済みです) – aribeiro

答えて

0

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

       } 
      }); 
} 
+0

super !!答えに感謝します。 getActivity()をnullでチェックする必要があるのはなぜですか? –

+0

アクティビティが破棄されたときには、そのコンテキストが存在しないためです。 – user1001

0

フラグメントのonDetach()messageListenernullを設定する必要があります。

@Override 
    public void onDetach() { 
     super.onDetach(); 
     messageListener = null; 
    } 
関連する問題