2016-03-24 127 views
0

我使用android和套接字進行聊天應用。聊天界面在片段內。雖然兩款設備都顯示聊天界面,但它運行良好。但是當一個設備關閉時,它會給我錯誤的力量關閉。當活動被破壞時,片段監聽器不工作

這是我的代碼。 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

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

       } 
      }); 
     } 
    }; 

} 

在longcat它說。

FATAL EXCEPTION: EventThread 
java.lang.NullPointerException 

在應用程序中,它強制關閉時消息來了,活動關閉。消息即將到來時如何處理此偵聽器,並關閉活動?謝謝。

+0

可能重複[什麼是空指針異常,以及如何解決它?](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

超級!感謝你的回答。爲什麼我們必須用null檢查getActivity()? –

+0

因爲當你的活動被破壞時,你將不會有它的上下文。 – user1001

0

您必須在片段的onDetach()中設置messageListenernull

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