2013-07-21 4 views
0

기본적으로 활동에 의해 초기화 된 실행중인 활동의 백그라운드에서 실행되는 소켓 클래스가 있습니다. socket.io 서버의 컴퓨터에서 콜백으로받을 수있는 Android 앱에 로그온 한 메시지를 보낼 수는 있지만 현재 실행중인 작업에 해당 메시지를 전달하고 싶습니다. 의도를 사용할 수 있습니다. 활동이 다시 시작될 것이기 때문입니다. 이것이 내가 시도한 것입니다.백그라운드에서 실행중인 클래스의 데이터를 현재 실행중인 활동으로 전달합니다.

@Override 
    public void on(String event, IOAcknowledge ack, Object... data) { 
     // if((JSONObject) data[0]!=null) 
     //callback.on(event, (JSONObject) data[0]); 
     System.out.println("Server triggered event '" + event + "'"); 
     //Log.d("Message","Yeah"); 
     if (event.equals("message")) { 
     System.out.println(data[2]); 
     //System.out.println("Server sent this '" + data.getString("message") + "'"); 
     Chat chatter=new Chat(); 
     chatter.getMsg((String)data[2]); 
     } 
    } 

이것은 콜백을받는 방법입니다. 보시다시피 실행중인 작업에 대한 메서드를 호출하여 데이터를 전달했습니다. 여기 있습니다.

public void getMsg(String mssg){ 
     //System.out.println(mssg); 
     HashMap mapper=new HashMap(); 
     mapper.put("message"mssg); 
     mapper.put("name","them"); 
     chatList.add(mapper); 
     //connect.start(msg); 
     ListAdapter adapter =new SimpleAdapter(
       Chat.this, chatList, 
       R.layout.chat_view, new String[]{"message","name"}, 
       new int[]{R.id.senderchatMessage, R.id.senderchatName} 
       ); 
     setListAdapter(adapter); 
     //return msg; 
    } 

이 메서드는 활동에 있습니다. 그러나 나는 IllegalStateException : 시스템 서비스를 사용할 수 없습니다 onCreate() 전에 사용할 수 없다는 오류 메시지가 나타납니다. 나는 그것이 실제로 무엇을 의미하는지 이해하지 못합니다.

답변

1

경우 runOnUiThread() 방법에 UI 코드를 실행하려고 할 수도 있습니다 다음은 좋지 않습니다.

Chat chatter = new Chat(); 

내 제안은 약간의 문제이며 적절한 방법으로 간주되지 않을 수 있습니다 (또는 작동하지 않을 수도 있음).

은 활동 클래스의 정적 변수 mContext를 만듭니다

public static Context mContext; 

.... 

.... 

// set it up in your onCreate() 
mContext = Chat.this; 

을 다음과 같이 변경합니다 실행중인 경우

@Override 
public void on(String event, IOAcknowledge ack, Object... data) { 
    // if((JSONObject) data[0]!=null) 
    //callback.on(event, (JSONObject) data[0]); 
    System.out.println("Server triggered event '" + event + "'"); 
    //Log.d("Message","Yeah"); 
    if (event.equals("message")) { 
    System.out.println(data[2]); 
    //System.out.println("Server sent this '" + data.getString("message") + "'"); 

    Intent newIntent = new Intent(Chat.mContext, Chat.class); 

    newIntent.putExtra("MSG", (String)data[2]); 

    Chat.mContext.startActivity(newIntent); 

    } 
} 

이 의도는 Chat 활동의 onNewIntent() 방법에 의해 차단됩니다. 그것을 무시해야합니다.

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    if (intent.hasExtra("MSG")) { 
     // Retrieve the message and call getMsg(String) 
     getMsg(intent.getStringExtra("MSG")); // Use the same key as before 
    } 
} 

이 방법이 효과가 있는지 확인하십시오.

+0

고마워. –

+0

잠깐. Context 유형의 mContent입니까? 당신은 명확히하는 것을 잊었습니다. –

+0

@MichaelNana 지금 잡아라. 'mContext'에 대해 조심스럽게 말하면, 위의 두 번 mContent로 철자가 잘못되었습니다. – Vikram

0

당신이 지금 허용 당신의 UI 스레드가 아닌 다른 스레드에서 UI를 업데이트 할 수 있으므로 Chat이 활동은 일입니다

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // your ui code 
    } 
    }); 
+0

도움 주셔서 감사합니다. 그러나 데이터를 전달하려는 클래스가 액티비티가 아니기 때문에이 메서드는 작동하지 않습니다. –

+0

hımm 해당 클래스에 컨텍스트 개체를 전달할 수 있습니까? 만약 네가 할 수만 있다면 운동 할 수도있어 –

관련 문제