2013-01-22 39 views
0

在我的应用程序中,我有用于读取状态的12位数的字节数组。写完这个数组后,我得到了不同按钮的状态。基于这个回应,我将我的按钮设置为ON | OFF。我正在重复执行此任务。如果我设置的间隔时间太少,例如100ms,并且频繁按下这些按钮,则我的应用程序停止响应。应用程序在频繁执行读/写操作时没有响应

这是代码片段。

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity);   
    getSharedSettings(); 

    fanDimmer1=(ToggleButton)findViewById(R.id.button_fan1); 
    fanDimmer2=(ToggleButton)findViewById(R.id.button_fan2); 
    dimmerLight1=(ToggleButton)findViewById(R.id.button_light1); 
    dimmerLight2=(ToggleButton)findViewById(R.id.button_light2); 


    fanDimmer1.setOnClickListener(this); 
    fanDimmer2.setOnClickListener(this); 
    dimmerLight1.setOnClickListener(this); 
    dimmerLight2.setOnClickListener(this); 

    if(ip.equals("") || port.equals("")) 
    { 
     new AlertDialog.Builder(MainActivity.this) 
     .setTitle("Warning !") 
     .setMessage("Please set IP and PORT first") 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .setNeutralButton("ok", null) 
     .show(); 
    } 
    else 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Log.v(TAG, "openconnection"); 
       openConnection(); 
      } 
     }).start(); 
     m_handler = new Handler(); 
     startRepeatingTask(); 

    } 

} 

public void openConnection() 
{ 
    // TODO Auto-generated method stub 
    try 
    { 
     s = new Socket(ip, Integer.parseInt(port)); 
     i = s.getInputStream(); 
     iD = new DataInputStream(i); 
     o = s.getOutputStream(); 
     oD = new DataOutputStream(o); 
     Log.v(TAG, "openconnection 2"); 

    } 
    catch (UnknownHostException e) { 
     // TODO: handle exception 
     Log.v("UnknowHostException :::::", "In Catch Block"); 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     // TODO: handle exception 
     Log.v("IOException :::::", "In Catch Block"); 
     e.printStackTrace(); 
    } 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     updateStatus(); 
     m_handler.postDelayed(m_statusChecker,100); 
    } 

    private void updateStatus() 
    { 
     // TODO Auto-generated method stub 
     Log.v("test", "1"); 
     try { 
      byte[] data1 = new byte[1024], packet1 = 
       { 
        (byte) 0x00,(byte) 0x00,(byte) 0x00, 
        (byte) 0x00,(byte) 0x00,(byte) 0x06, 
        (byte) 0x01,(byte) 0x01,(byte) 0x00, 
        (byte) 0x00,(byte) 0x00,(byte) 0x19 
       }; 

      o.write(packet1); 
      i.read(data1, 0, 1024); 

      byte_to_hex = ConversionMethods.bytesToHex(data1).substring(18, 26); 
      char[] arr = byte_to_hex.toCharArray(); 
      for (int i = 0; i < arr.length - 1; i += 2) 
      { 
       char temp = arr[i]; 
       arr[i] = arr[i + 1]; 
       arr[i + 1] = temp; 
      } 

      swapped_result=new String(arr); 
      result = ConversionMethods.hexStringToNBitBinary(swapped_result, 32); 

      int counter = 0; 
      for(int i=0; i<result.length(); i++) 
      { 
       if(result.charAt(i) == '1') 
       { 
        counter++;   
       } 
      } 
      status=Integer.toString(counter); 
      txt_status.setText(status); 
      Log.v(TAG, "status is ::"+status); 


      char[] c=result.toCharArray(); 
      int count=0; 
      for (int i=0;i<result.length();i++) 
      { 
       count++; 
       char j=c[i]; 
       //Log.v(TAG, count+"::"+j); 
       if(count==1) 
        toggleButton=dimmerLight1; 
       else if(count==2) 
        toggleButton=fanDimmer2; 
       else if(count==3) 
        toggleButton=fanDimmer1; 
       else if(count==4) 
        Log.v(TAG, "Count 4 is 0"); 

       if(j=='1') 
        toggleButton.setChecked(true); 
       else 
        toggleButton.setChecked(false); 
      } 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
}; 

void startRepeatingTask() { 
    m_statusChecker.run(); 
} 

void stopRepeatingTask() { 
    m_handler.removeCallbacks(m_statusChecker); 
} 

而且按钮点击我这样做:

@Override 
public void onClick(View v) 
{ 

    if(v.equals(fanDimmer1)) 
    { 
     if (fanDimmer1.isChecked()) 
     { 
      Toast.makeText(MainActivity.this, "Fan 1 is ON", Toast.LENGTH_SHORT).show(); 
      setByteArray((byte) 0x01, (byte) 0xff); 
     } else 
     { 
      Toast.makeText(MainActivity.this, "Fan 1 is OFF", Toast.LENGTH_SHORT).show(); 
      setByteArray((byte) 0x01, (byte) 0x00); 
     } 
    } 

} 

这里是setByteArray()方法 我有24个这种类型的按钮。

任何意见和建议,将不胜感激。
感谢

回答

1

你是从你的主线程中调用startRepeatingTask()

void startRepeatingTask() { 
    m_statusChecker.run(); 
} 

这意味着你的statusChecker将在主线程中运行过。

  • 要做的第一件事就是更新updateStatus方法的代码,并使用mHandler后唯一的用户界面,更新代码的主UI线程

  • 接下来,您必须运行statusChecker在另一个线程

要做到这一点,你有(至少)两个选项:

  1. [复杂的方式]做你自己的线程管理和写这样的事情在你的startRepeatingTask

    void startRepeatingTask() { new Thread(m_statusChecker).start(); }

    适应stop方法(即使用一个显示器,一个无限循环和睡眠)

  2. [聪明的办法]就拿从Android API看看TimerTimerTask(和this),并利用它们来实现你所需要的。

EDIT

聚焦此代码:

for (int i=0;i<result.length();i++) 
     { 
      count++; 
      char j=c[i]; 
      //Log.v(TAG, count+"::"+j); 
      if(count==1) 
       toggleButton=dimmerLight1; 
      else if(count==2) 
       toggleButton=fanDimmer2; 
      else if(count==3) 
       toggleButton=fanDimmer1; 
      else if(count==4) 
       Log.v(TAG, "Count 4 is 0"); 

      if(j=='1') 
       toggleButton.setChecked(true); 
      else 
       toggleButton.setChecked(false); 
     } 

该环路的效果将是:

  • 迭代0(如果有的话):dimmerLight1将检查或未选中
  • 迭代1(如果有):fanDimmer2将被选中或取消选中的KED
  • 迭代2(如果有的话):fanDimmer1将被选中还是未选中
  • 迭代3(如果有的话):fanDimmer1将被选中还是未选中
  • 迭代4(如果有的话):fanDimmer1将被选中还是未选中
  • 迭代5(如果有的话):fanDimmer1将被选中或取消选中
  • ...(fanDimmer1将是检查或取消选中,直到循环结束)

我敢肯定这不是你所需要的。 (除非result.size()始终是3,但在任何其他情况:该代码会产生奇怪的事情)

你可以做这样的事情:

//assuming buttons is a ToggleButton[32] populated with all your buttons in the correct order 
for (int i=0;i<result.length();i++) 
    { 
     buttons[i].setChecked(c[i]=='1'); 
    } 
+0

谢谢,我会请根据我的代码您的建议 – juned

+0

早些时候我使用计时器来获取更新的值和更新UI我使用'runOnUiThread'方法,但我没有成功得到所需的结果。所以在此之后,我将代码更改为 – juned

+0

runOnUiThread是要走的路。确保只用于UI更新:'txt_status.setText(status);'和'toggleButton.setChecked(...);' – ben75