2012-02-24 2 views
0

EditText의 String 값을 스레드의 메서드 인 "channel.basicpublish"에 전달하려고합니다. Edittext.gettext()와 같은 메소드 "basicpublish"에서 여러 가지 방법을 시도해 보았습니다. tostring 또는 전역 변수를 선언하고 (override) 위의 변수를 지역 변수에 전달하지만 다른 한편으로는 빈 문자열을 얻습니다. 오류. 나는 또한 번들/의도를 시도했지만 아무것도 나를 위해 일하고있다 (오류를 준다). 일반 문자열 (Message = "HelloRabbitmq")을 전달하기 때문에 다음 코드가 작동합니다. 그럼 내가 어떻게 edittext에서 "basicpublish"스레드에있는 문자열을 전달할 수 있습니까?Edittext를 스레드에 전달

public class HandlerActivity extends Activity { 
    /** Called when the activity is first created. */ 
    TextView tv; 
    EditText etv; 
    String QUEUE_NAME="bye"; 
    String EXCHANGE_NAME="logs"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv = (TextView) findViewById(R.id.out); 
     etv = (EditText) findViewById(R.id.out2); 
     etv.setOnKeyListener(new OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       // If the event is a key-down event on the "enter" button 
       if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
        (keyCode == KeyEvent.KEYCODE_ENTER)) { 
        // Perform action on key press 
        Toast.makeText(HandlerActivity.this, etv.getText(), Toast.LENGTH_SHORT).show(); 
        String Kamran = etv.getText().toString();  
        return true; 
       } 
       return false; 
      } 
     }); 
    final Handler handler=new Handler(); 
    final Runnable r=new Runnable() 
    { 
      public void run() 
      { 
       tv.append("Hello"); 

      } 
    }; 
    handler.postDelayed(r, 1000); 
    Thread thread = new Thread() 
    { 
      @Override 
      public void run() {    
       try { 
        while(true) { 
         sleep(1000); 
         ConnectionFactory factory = new ConnectionFactory(); 
         factory.setHost("192.168.2.3"); 
         Connection connection = factory.newConnection(); 
         Channel channel = connection.createChannel(); 
         channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true); 
         channel.queueDeclare(QUEUE_NAME, false, false, false, null); 
         String message = "Hello Rabbitmq";     
         channel.basicPublish("logs",QUEUE_NAME, null, message.getBytes()); 
         channel.close(); 
         connection.close(); 
         handler.postDelayed(r, 1000); 
         } 
       } 
         catch (Exception e) { 
          // TODO: handle exception 
         e.printStackTrace(); 
         }   
      } 
    }; 
    thread.start(); 
      } 

} 

답변

0

클래스 변수는이에 대한 잘 작동합니다 ... 작동하지만 당신이 그것을 가지고 어떻게 다시 변경 자유롭게 할 수있다 , 그러나 EditText보기의 텍스트 외에도 코드에 다른 결함이있는 것으로 보입니다.

같은 뭔가 :

public class HandlerActivity extends Activity { 

private TextView tv; 
private EditText etv; 

private String QUEUE_NAME = "bye"; 
private String EXCHANGE_NAME = "logs"; 
private String message = ""; 

private Handler handler; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    handler = new Handler(); 

    tv = (TextView) findViewById(R.id.out); 
    etv = (EditText) findViewById(R.id.out2); 
    etv.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
        (keyCode == KeyEvent.KEYCODE_ENTER)) { 

       Toast.makeText(HandlerActivity.this, etv.getText().toString(), Toast.LENGTH_SHORT).show(); 
       message = etv.getText().toString(); 

       return true; 
      } 
      return false; 
     } 
    }); 

} 

@Override 
public void onStart() { 
    super.onStart(); 

    handler.postDelayed(publish, 1000); 

} 

private Runnable publish = new Runnable() { 
    public void run() { 
     try { 
      //You should probably not have this as "true", you should always have some way to bail out of this. 
      //Technically even if you kill this activity it may never stop. 
      while(true) { 
       ConnectionFactory factory = new ConnectionFactory(); 
       factory.setHost("192.168.2.3"); 
       Connection connection = factory.newConnection(); 
       Channel channel = connection.createChannel(); 
       channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true); 
       channel.queueDeclare(QUEUE_NAME, false, false, false, null);     
       channel.basicPublish("logs", QUEUE_NAME, null, message.getBytes()); 
       channel.close(); 
       connection.close(); 

       //Why are you running the this loop again? Uncomment if thats REALLY what you want 
       //handler.postDelayed(publish, 1000); 
      } 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     }  
    } 
}; 
+0

고마워, 내 에뮬레이터가이 코드에 응답하지 않습니다. 하지만 클래스 변수가 그 일을했습니다. 고마워요! – user1047222

0

당신이 ETVTextWatcher를 설정하고 문자열 멤버 변수를 설정하려고 했나,의는 에서이 콜백을 afterTextChanged ETV의 값으로, etvValue을 가정 해 봅시다? 그런 다음, basicPublish에 etvValue전달은

가 나는 또한 몇 가지 변경을 ...

+0

아니, 나는를 havent하지만 문자열 문자열 = 같은 선언 gloabl 변수는 ""작업을 수행합니다. 어쨌든 감사드립니다. – user1047222

관련 문제