2013-01-18 95 views
0

我得到一个错误的线程错误,所以我想我需要从UI线程运行无效。通常我有这样的:编辑代码以在UI线程上运行?

public void run() { 

       runOnUiThread(new Runnable() { 
}}); 

但我需要命名此runnable从一个方法引用它。我如何将runOnUiThread合并到此?

Handler viewHandler = new Handler(); 
Runnable updateView = new Runnable() { 
@Override 

public void run() { 

    mEmulatorView.invalidate(); 

    if (statusBool == true) { 
     for (int i = 1; i < dataReceived.length() - 1; i++) { 

      if (dataReceived.charAt(i) == '>') { 

       Log.d(TAG, "found >"); 
       deviceStatus = 0; 
      } 
      if (dataReceived.charAt(i) == '#' 
        && dataReceived.charAt(i - 1) != ')') { 

       Log.d(TAG, "found #"); 
       deviceStatus = 1; 
      } 
      if ((i + 1) <= (dataReceived.length()) 
        && dataReceived.charAt(i) == ')' 
        && dataReceived.charAt(i + 1) == '#') { 

       Log.d(TAG, "found config)#"); 
       deviceStatus = 2; 
      } 

     } 
     statusBool = false; 
     viewHandler.postDelayed(updateView, 1000); 

    } 
} 
}; 

称之为:

public void onDataReceived(int id, byte[] data) { 

     dataReceived = new String(data); 
     ((MyBAIsWrapper) bis).renew(data); 
     mSession.write(dataReceived); 
     viewHandler.post(updateView); 
} 
+1

你确定你说错了吗?如果你将它发布到'viewHandler'并且在UI线程上创建'viewhandler',那么它不应该抛出这样的错误。 –

+0

你能在这里发布错误信息吗? –

+0

这里是错误:http://i.imgur.com/s4mTt.png – Paul

回答

1

你不需要命名它。如果您想发表自己,你可以只使用this关键字:

viewHandler.postDelayed(this, 1000); 

UPDATE

错误的线程错误引起的mSession.write(dataReceived);updateView不会导致任何问题。尝试将mSession.write包装为可运行并在UI线程上调用它。

+0

谢谢我现在会尝试,但是不可能两个都做? – Paul

1

得到它的工作,我只需要在UI线程中运行该写入线,即使我认为它是?!

public void onDataReceived(int id, byte[] data) { 

     dataReceived = new String(data); 
     ((MyBAIsWrapper) bis).renew(data); 

     runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       mSession.write(dataReceived);  
      }}); 

     viewHandler.post(updateView); 
    }