2016-03-24 15 views
0

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.

+0

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

Antwort

0

Sie sollten zunächst für getActivity() überprüfen.

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 !! Danke für die Antwort. Warum müssen wir getActivity() mit null überprüfen? –

+0

Weil, wenn deine Aktivität zerstört ist, du keinen Kontext hast. – user1001

0

Sie müssen messageListener zu null in onDetach() Ihres Fragments setzen.

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