Skocz do zawartości

Recommended Posts

Napisano

Próbuję napisać aplikację która będzie odbierała dane z bluetooth HC-05, wszystko by było dobrze, ale aplikacja zawiesza się gdy czyści bufor. Gdy zakomentuję linijkę czyszczenia bufora aplikacja się nie zawisza. W czym tkwi problem.

public void run() {

           byte[] buffer = new byte[1024];
           int bytes;
           //final StringBuilder sBuffer = new StringBuilder("");
           final StringBuffer sBuffer = new StringBuffer("");

           while (true)
           {
               try
               {
                    // Read from the InputStream

            	   bytes = mmInStream.read(buffer);

                    if(bytes > 0)
                    {
                    	byte[] newbuffer = new byte[bytes];
                    
                    	for(int i = 0; i < bytes; i++)
                    		newbuffer[i] = buffer[i];

                    
                    	final String data2 = new String(newbuffer, "US-ASCII");
                    	handler.post(new Runnable()
	                    {
	                        public void run()
	                        {
	                        	if(data2.indexOf('>')==-1)
	                        	{
	                        		sBuffer.append(data2);
		                       }
	                        	else
	                        	{
	                        		sBuffer.append(data2);
	                        
		                        	String data=new String(sBuffer);
	                        
		                        	data=data.substring(data.indexOf('<')+1,data.indexOf('>'));
		                        	String[] lista = data.split("#");
		                        	tvVoltage.setText(" ");
		                        	tvVoltage.setText(data);
		                        	sBuffer.delete(0, sBuffer.length()); // Gdy zakomentuję tę linię aplikacja nie zawiesza się
	                        	}
	                        }
	                    });
                    }
               }
               catch (IOException e)
                {
                	Log.e("BT", "watcher", e);
                	break;
                }
            }
        }

 

Napisano

Chodzi o logcat?

12-26 20:12:30.648: W/dalvikvm(5891): threadid=1: thread exiting with uncaught exception (group=0x40018578)
12-26 20:12:30.656: E/AndroidRuntime(5891): FATAL EXCEPTION: main
12-26 20:12:30.656: E/AndroidRuntime(5891): java.lang.StringIndexOutOfBoundsException
12-26 20:12:30.656: E/AndroidRuntime(5891):     at java.lang.String.substring(String.java:1651)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at com.example.bt1.MainActivity$ConnectedThread$2.run(MainActivity.java:240)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at android.os.Handler.handleCallback(Handler.java:587)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at android.os.Looper.loop(Looper.java:130)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at android.app.ActivityThread.main(ActivityThread.java:3687)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at java.lang.reflect.Method.invokeNative(Native Method)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at java.lang.reflect.Method.invoke(Method.java:507)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-26 20:12:30.656: E/AndroidRuntime(5891):     at dalvik.system.NativeStart.main(Native Method)
Napisano
Co to jest handler i dlaczego wątek do niego jest deklarowany w kółko do wystąpienia wyjątku ? Skąd wiesz że nie deklarujesz nowego wątku dla handler.post zanim jeszcze ten ostatni się skończył ? Skąd wiesz że data2 nie jest ponownie wypełniana przez newbuffer zanim zostanie dopisana do sBuffer w wątku dla handlera ?
Napisano
Może po prostu użyj StringBuildera (jest praktycznie tym samym, lecz nowszy i z obsluga wielowatkowego dostepu). I bez używania final. Niech garbage collector sobie go zmiecie. EDIT: Ewentualnie jest to problem z tym, że buffer jest pusty, dodaj if'a

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...