2011-05-26 25 views
12

Android:我如何顯示從在遠程服務中運行的線程吐司?每當我從不同的線程在服務運行時,應用程序崩潰...Android:我如何顯示從遠程服務中運行的線程的吐司?

public class BroadcastService extends Service { 

private static final String TAG = BroadcastService.class.getSimpleName(); 
private MessageFormatter mFormatter = new MessageFormatter(); 
private BroadcastComm broadCastComm = new BroadcastComm(); 
private Task commTask = new Task(); 
private volatile static boolean stopBroadcastRequested = false; 
private volatile static boolean isSocketOpen = false; 
private volatile static byte[] messageToBeSent; 
private Handler serviceHandler; 
private ConnectivityStatus connStatus; 


@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.e(TAG, "Service creating"); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    serviceHandler = new Handler(); 
    serviceHandler.post(commTask); 
    stopBroadcastRequested = false; 
    messageToBeSent = mFormatter.formBroadCastMessage("GET_PERIPH_DATA"); 
} 


class Task implements Runnable{ 

    @Override 
    public void run() { 
     while(!stopBroadcastRequested){ 
          Toast.makeText(context, "SSSSSSSSSS", 5).show(); 
      Log.i(TAG, "Thread Task started");   
      try { 
       Log.d("SERVICE CLASS", "STARTED THREAD - Writing in output stream"); 
       isSocketOpen = broadCastComm.isAliveOrOpenSocket("192.168.43.2", 6000, 17, 0); 

       if(isSocketOpen){ 
        OutputStream outStream = broadCastComm.getCurrentOutputStream(); 

        outStream.write(messageToBeSent); 
        if(Integer.valueOf(messageToBeSent[2]) != (byte)0xA0){ 
         Log.e("REVERTING", "REVERTING"); 
         messageToBeSent = mFormatter.formBroadCastMessage("GET_PERIPH_DATA"); 
        } 

        Log.d("OUTPUT STREAM", "Message sent ->" + ByteArrayToString(messageToBeSent)); 
       } 

       Thread.sleep(3000L); 
       if(isSocketOpen){ 
        Log.d("SERVICE CLASS", "Started input"); 
        InputStream inStream = broadCastComm.getCurrentInputStream(); 
        BufferedInputStream buf = new BufferedInputStream(inStream); 
        byte[] buffer; 

        while(buf.available() > 0){ 
         Log.d("SERVICE CLASS", "Input available"); 
         int size = buf.available(); 
         buffer = new byte[size]; 
         inStream.read(buffer, 0, size); 
         if(buffer[2] == (byte)0xA0){ 
          BroadcastPacket packet = broadCastComm.decodeSocketData(buffer); 
          synchronized (incomingPacketLock) { 
           latestBroadcastPacket = packet; 
          } 
          synchronized (listeners) { 
           for (BroadcastListener listener : listeners) { 
            try { 
             listener.handlePacketsUpdated(); 
            } catch (RemoteException e) { 
             Log.w(TAG, "Failed to notify listener " + listener, e); 
            } 
           } 
          } 
         } 
        } 
       } 

      } catch (Throwable t) { 
       Log.e(TAG, "Failed to retrieve data in thread", t); 
      } 
      Log.d("SERVICE CLASS", "End of THREAD"); 

     } 
     if(stopBroadcastRequested){ 
      Log.e("SERVICE", "STOPPED THREAD"); 
     } 
    } 

    public synchronized void stopThread(){ 
     stopBroadcastRequested = true; 
    } 

} 

    ........... 

@Override 
public IBinder onBind(Intent intent) { 
    if (BroadcastService.class.getName().equals(intent.getAction())) { 
     Log.d(TAG, "Bound by intent " + intent); 
     return apiEndpoint; 
    } else { 
     return null; 
    } 
} 


    ......... 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.e(TAG, "Service destroying"); 
    stopBroadcastRequested = true; 
    broadCastComm.clearConnections(); 
    try { 
     serviceHandler.removeCallbacks(commTask); 
     serviceHandler = null; 

    } catch (Exception e) { 
     Log.d("SERVICE", "FAILED TO REMOVE CALL BACKS"); 
    } 

    commTask.stopThread(); 
    //currentThread = null; 
} 

}

+0

顯示堆棧跟蹤? – Femi 2011-05-26 05:21:20

+0

java.lang.RuntimeException:無法在未調用Looper.prepare()的線程內創建處理程序 – Abraham 2011-05-26 05:22:58

+0

任何想法我可以做到這一點? – Abraham 2011-05-26 05:27:48

回答

44

這是我做到了。當然,你需要傳遞適當的上下文。

Handler h = new Handler(context.getMainLooper()); 

    h.post(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(context,message,Toast.LENGTH_LONG).show(); 
     } 
    }); 
+0

漂亮。不知道你能做到這一點! – Femi 2011-05-26 05:35:36

+0

謝謝....它的工作...... :) – Abraham 2011-05-26 05:47:42

+12

什麼是'上下文'在這裏? – emaillenin 2012-01-07 20:48:29

0

我不確定,但這看起來又像是試圖在非GUI線程上調用GUI方法。

2

如果有人不明白@Alex Gitelman答案中的內容。寫下你的班級名稱來代替你正在寫這個處理程序代碼的環境

Handler h = new Handler(MyClassName.this.getMainLooper()); 

h.post(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(MyClassName.this,"show toast message",Toast.LENGTH_LONG).show(); 
    } 
});