2013-08-16 12 views
3

如何在一個線程內添加一個Toast方法。我想通過用一個吐司方法替換system.out來顯示結果到顯示器進行調試。我知道使用應用程序上下文從線程內,如下所示: Toast.makeText(getApplicationContext(),「help」,Toast.LENGTH_LONG).show(); 將不起作用。如何用一個線程內的Toast替換system.out

我不知道怎麼用了Runnable與吐司呼叫並從Thread

調用runOnUiThread(可運行)有人能幫助我。

public class NetworkServer extends Thread 
{ 

    DatagramSocket mSocket = null; 
    boolean isFinish = false; 

    private SimplestPossibleActivity activity; 

    public NetworkServer(SimplestPossibleActivity activity) 
    { 
    this.activity = activity; 
    } 

    public void run() 
    { 

     try 
     { 

     Log.d("UDP", "Listening"); 
     mSocket = new DatagramSocket(2010); //4444 
     mSocket.setBroadcast(true); 

     while (!isFinish) 
     { 

      Log.d("UDP", "C: socket create success"); 
      byte[] recvbuffer = new byte[12]; 
      DatagramPacket packet = new DatagramPacket(recvbuffer,recvbuffer.length); 
      Log.d("UDP", "receiving..."); 
      mSocket.receive(packet); 
      Log.d("UDP", "received packet"); 

      ByteBuffer bb = ByteBuffer.allocate(recvbuffer.length).order(ByteOrder.LITTLE_ENDIAN); 
      bb.put(recvbuffer); 
      bb.rewind(); 
      //System.out.println(bb.getFloat()); 
      //System.out.println(bb.getFloat()); 
      //System.out.println(bb.getFloat()); 


      Bundle data = new Bundle(); 
      data.putFloat("latitude", bb.getFloat()); 
      data.putFloat("longitude", bb.getFloat()); 
      data.putFloat("altitude", bb.getFloat()); 

      Message msgHandle = new Message(); 
      msgHandle.setData(data); 
      mhandler.sendMessage(msgHandle); 

     } //end while 
    } catch (Exception e) { 
     Log.e("UDP", "C: Error", e); 
    } 

    } 

    private Handler mhandler = new Handler() 
    { 

     @Override 
     public void handleMessage(Message msg) 
     { 

      Bundle data = msg.getData(); 
      Log.d("NetworkServer","adding position" + "lat = " + data.getFloat("latitude") + 
           "lon = " + data.getFloat("longitude") + 
           "alt = " + data.getFloat("altitude")); 
      activity.addPosition(data.getFloat("latitude"), 
           data.getFloat("longitude"), 
           data.getFloat("altitude")); 

    } 

    }; 
} 
+0

您可以用'runOnuiThread'。但'runOnuiThread'是活動類的一種方法。你不能在後臺線程上更新ui。應該更新ui線程 – Raghunandan

+0

你不能在工作線程上顯示吐司。你只能使用'Handler','runOnUiThread()'或'AsyncTask'。 – Sajmon

回答

0

你可以像下面這樣做
Handler handler = new Handler(); //Before your Thread

//Within your thread 
handler.post(new Runnable(){ 
       public void run() { 
        Toast.makeText(getApplicationContext(), "help", Toast.LENGTH_LONG).show(); 
      } 
     }); 
+0

只有當處理程序在主線程上啓動時纔有效。 – allprog

7

使用庫Xdroid

dependencies { 
    compile 'com.shamanland:xdroid-toaster:0.2.4' 
} 

有相當不錯的方法:

  1. Context變量不是必需的。
  2. runOnUiThread()不是必需的。

只需調用單一方法即可!

// using the resource string 
Toaster.toast(R.string.my_msg); 
// or hard-coded string 
Toaster.toast("Hello Xdroid!"); 

還有更多的例子在這裏:https://github.com/shamanland/xdroid-toaster-example

0
runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       //pick one: 

       //if activity 
       Toast.makeText(YOURACTIVITYNAME.this, "help", Toast.LENGTH_LONG).show(); 

       //if fragment 
       Toast.makeText(getActivity(), "help", Toast.LENGTH_LONG).show(); 
      } catch (final Exception e) { 

      } 
     } 
    }); 
+1

不好的想法趕上'例外',什麼都不做 –

相關問題