2013-03-25 2 views
0

Google Cloud Message를 통해 들어오는 메시지를 허용하는 Activity Class에 구현 된 BroadcastReceiver가 있습니다. 나는 채팅으로이 클래스를 사용하려면, 그래서 들어오는 메시지가 후에, 나는 빈 공간을 사용 : 내가 들어오는 메시지를 수집하고, 내가 그들에게 보여 할 수 있도록 레이아웃을 만들려고 말했듯이BroadcastReceiver 메시지 수신 중 오류가 발생했습니다.

public void Chatpat(String name, String message){ 

     chatinput.add(name); 
     chatinput.add(message); 


     Chat chat_data[] = new Chat[chatinput.size()]; 
     chatinput.toArray(); 


     ChatAdapter adapter = new ChatAdapter(this, 
       R.layout.listview_item_row, chat_data); 

     chatList = (ListView) findViewById(R.id.listView1); 
     chatList.setAdapter(adapter); 

     return; 
    } 

. 내 ChatAdapter이 처리합니다. 문제는 BroadcastReceiver에서 메시지를 가져 오려고 할 때 오류가 발생한다는 것입니다.

String message_name = intent.getExtras().getString(NAME_MESSAGED); 
String message_chat = intent.getExtras().getString(CHAT_MESSAGED); 

이 희망 난 내 어댑터가 내가 가진 메시지를 표시하는 목록보기 만들려면 그 후, 수있을 것이라고 희망하고 :이 줄을 사용

Chatpat(message_name, message_chat); 

는 수신 메시지를 수집 곧. 문제는 내가 오류가 발생하고 응용 프로그램이 충돌한다는 것입니다.

03-25 22:22:09.928: E/AndroidRuntime(1010): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.cabman.lol.ok.DISPLAY_MESSAGE (has extras) } in [email protected] 

또한 Chatpat void 내에서 NullPointerException이 발생합니다. 내가 제거 할 경우 :

Chatpat(message_name, message_chat); 

을 브로드 캐스트 리시버 내부에서, 메시지는 이런 일이 발생하는 이유는 이해가 안 .. 아무 문제없이 올바른 방법으로오고있다. 나는 그 문제가 그 들어오는 메시지를 사용하여 메시지를 보여주기 위해 목록보기를 만드는 Chatpat를 시작한다는 사실과 관련이 있다고 믿습니다.

정말 이상한 일은 다른 출처와 함께 Chatpat에게 먹이를 주려고 노력하고 있지만 값을 출력하려고하면받는 Intent에 대해 동일한 Error가 다시 발생합니다.

이 전체 활동 :

public class UserComActivity extends Activity{ 
List<String> messages; 
List<String> names; 
private ListView chatList; 
SessionManager session; 
EditText userText; 
EditText chatText; 
UserFunctions user = new UserFunctions(); 
String informchat = "yes"; 
String message_gcm; 
Boolean i = false; 
Chat chat_data[] ; 
ArrayList<String> chatinput = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.userchat); 


    registerReceiver(mHandleMessageReceiver, new IntentFilter(
      DISPLAY_MESSAGE_ACTION)); 

    //chatText = (EditText) findViewById(R.id.messageHistory); 
    userText = (EditText) findViewById(R.id.message); 






    final String regId = GCMRegistrar.getRegistrationId(this); 
    final Button button = (Button) findViewById(R.id.sendMessageButton); 
    session = new SessionManager(getApplicationContext()); 
    HashMap<String, String> comu = session.matchUserDetails(); 


    button.setOnClickListener(new View.OnClickListener() { 



     @Override 
     public void onClick(View arg0) { 

      String message = userText.getText().toString(); 


      if (i == false){ 
    session = new SessionManager(getApplicationContext()); 
    HashMap<String, String> comu = session.matchUserDetails(); 
      String gcm = comu.get(SessionManager.KEY_GCM); 
      HashMap<String, String> co = session.getUserDetails(); 
      String name = co.get(SessionManager.KEY_NAME); 

      System.out.println("UserComActivity:"); 
      System.out.println(name); 
      System.out.println(gcm); 

      chatText.setText(name +": "+ message); 

      // user.sendMessage(name, gcm, regId, message); 
      } 
      else if (i == true){ 


      session = new SessionManager(getApplicationContext()); 
      HashMap<String, String> co = session.getUserDetails(); 
      String name = co.get(SessionManager.KEY_NAME); 

     // user.sendMessage(name, message_gcm, regId, message); 

      } 
     } 
}); 

} 



/** 
public ArrayList<String> addChat(String name, String message){ 


    chatinput.add(name); 
    chatinput.add(message); 

    return chatinput; 



}**/ 

    public void Chatpat(String name, String message){ 

     chatinput.add(name); 
     chatinput.add(message); 




     Chat chat_data[] = new Chat[chatinput.size()]; 
     chatinput.toArray(chat_data); 




     ChatAdapter adapter = new ChatAdapter(this, 
       R.layout.listview_item_row, chat_data); 

     chatList = (ListView) findViewById(R.id.listView1); 
     chatList.setAdapter(adapter); 

     return; 
    } 



private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 


     i = true; 
     String message_tag = intent.getExtras().getString(TAG_MESSAGE); 
     if(message_tag.equals("chat")){ 

     String message_name = intent.getExtras().getString(NAME_MESSAGED); 
     String message_chat = intent.getExtras().getString(CHAT_MESSAGED); 




     Chatpat(message_name, message_chat); 

     } 

    } 
}; 

@Override 
protected void onDestroy() { 

    try { 
     unregisterReceiver(mHandleMessageReceiver); 
     GCMRegistrar.onDestroy(this); 
    } catch (Exception e) { 
     Log.e("UnRegister Receiver Error", "> " + e.getMessage()); 
    } 
    super.onDestroy(); 
} 

}

이는 내가 활동에 원하는 텍스트를 표시하도록 목록보기를 만드는 데 사용하는 클래스입니다 :

public class Chat { 

public String name; 
public String message; 
public Chat(){ 
    super(); 
} 

public Chat(String name, String message) { 
    super(); 
    this.name = name; 
    this.message = message; 
    //System.out.println(name); 
    System.out.println("Chat!!!!!!"); 
} 

}

public class ChatAdapter extends ArrayAdapter<Chat>{ 

Context context; 
int layoutResourceId;  
Chat data[] = null; 


    public ChatAdapter(Context context, int layoutResourceId, 
Chat[] data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ChatHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ChatHolder(); 
     holder.txtUName = (TextView)row.findViewById(R.id.userName); 
     holder.txtMessage = (TextView)row.findViewById(R.id.txtChat); 
     System.out.println("ChatAdapter"); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ChatHolder)row.getTag(); 
    } 

    Chat chat = data[position]; 
    holder.txtMessage.setText(chat.message); 
    holder.txtUName.setText(chat.name); 
    System.out.println("ChatAdapter"); 
    return row; 
} 

static class ChatHolder 
{ 

    TextView txtUName; 
    TextView txtMessage; 
} 

}

로그 캣 : Chatpat에서

03-26 02:29:28.807: E/AndroidRuntime(5063): FATAL EXCEPTION: main 
03-26 02:29:28.807: E/AndroidRuntime(5063): java.lang.RuntimeException: Error receiving  broadcast Intent { act=com.cabman.lol.ok.DISPLAY_MESSAGE (has extras) } in [email protected] 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:905) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.os.Handler.handleCallback(Handler.java:587) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.os.Looper.loop(Looper.java:123) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at dalvik.system.NativeStart.main(Native Method) 
03-26 02:29:28.807: E/AndroidRuntime(5063): Caused by: java.lang.ArrayStoreException 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at java.lang.System.arraycopy(Native Method) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at java.util.ArrayList.toArray(ArrayList.java:523) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at com.cabman.lol.ok.UserComActivity.Chatpat(UserComActivity.java:149) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at com.cabman.lol.ok.UserComActivity$1.onReceive(UserComActivity.java:184) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:892) 
03-26 02:29:28.807: E/AndroidRuntime(5063):  ... 9 more 
+0

문제를 해결했는지 여부를 알려 주실까요? –

+0

아니 해결되지, 나도 그 문제가 뭔지 몰라. – user1732457

+0

내가 무엇을하려고하는지 알 수 있습니까? –

답변

1

당신이 chatinput.add(name);하지만 chatInput이는
ArrayList<String> chatinput = null;로 선언하고 당신의 활동에 어디 인스턴스화되지 않습니다. ArrayList<String> chatinput = new ArrayList<String>();

+0

나는 그것을 고쳤지 만, 여전히 같은 오류가 발생한다. – user1732457

+0

나는 아마 내가 들어오는 메시지를 잘못 조작하고 있고, 어댑터에 전달되는 방식이라고 생각한다. 데이터의 정적 배열을 넣으면 어댑터가 작동합니다. 문제는 BroadcastReceiver 내부에서 Chatpat()를 실행하면 들어오는 메시지를 Chatpat()에 전달하는 경우에도 여전히 동일한 오류가 발생하므로 알 필요가 없다는 것입니다. 해결할 수없는 문제로, UI의 UI를 업데이트하는 방법에 관해서. – user1732457

+0

ChatAdapter에서 this 대신 UserComActivity.this를 시도하십시오. adapter = new ChatAdapter (this, R.layout.listview_item_row, chat_data); –

관련 문제