2014-05-13 42 views
-1

我想结合我在网上找到的两个简单的应用程序。我有一个线程和5秒后,我的传感器列表应显示Toast消息。但没有任何反应..线程不是工作我认为我搞砸了一切,请你帮忙。我真的很appriciate我的线程不工作

public class MainActivity extends Activity{ 

    List<String>sName=new ArrayList<String>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toast.makeText(this, "Loadingg", Toast.LENGTH_LONG).show(); 

     Thread thr=new Thread(){ 
      @Override 
      public void run(){ 

       try { 
        sleep(5000); 
        StringBuilder message=DisplaySensors(); 
        Toast.makeText(getApplicationContext(),message, Toast.LENGTH_LONG).show(); 


       } catch (Exception e) { 
        // TODO: handle exception 
       } 


      } 

       private StringBuilder DisplaySensors() { 

       SensorManager sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE); 
       List<Sensor>sList=sm.getSensorList(Sensor.TYPE_ALL); 
       StringBuilder sb=new StringBuilder(); 
       for (int i = 0; i <sList.size(); i++) { 
        sb.append(((Sensor)sList.get(i)).getName()).append("\n"); 

       } 

       return sb; 

      } 



     }; 
     thr.start(); 


    } 
+2

你是一个'Thread'这是不对的内部显示'Toast'。它会崩溃吗? – Raghunandan

+0

No Raghunandan它does not – user3468916

+3

它不会崩溃,因为你有一个未处理的尝试捕获.. –

回答

1

所有的UI操作必须在主UI线程上运行。所以如果你想显示吐司消息,这不应该在一个分离的线程中完成。在这种情况下,Toast消息必须位于runOnUiThread()区块中,如下所示。

public class MainActivity extends Activity{ 

List<String>sName=new ArrayList<String>(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toast.makeText(this, "Loadingg", Toast.LENGTH_LONG).show(); 

    Thread thr=new Thread(){ 
     @Override 
     public void run(){ 

      try { 
       sleep(5000); 
       StringBuilder message=DisplaySensors(); 
       runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(),message, Toast.LENGTH_LONG).show(); 
       } 
      }); 



      } catch (Exception e) { 
       // TODO: handle exception 
      } 


     } 

      private StringBuilder DisplaySensors() { 

      SensorManager sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE); 
      List<Sensor>sList=sm.getSensorList(Sensor.TYPE_ALL); 
      StringBuilder sb=new StringBuilder(); 
      for (int i = 0; i <sList.size(); i++) { 
       sb.append(((Sensor)sList.get(i)).getName()).append("\n"); 

      } 

      return sb; 

     } 



    }; 
    thr.start(); 


} 
+1

而不是“试试这个”,你可以向OP和其他人解释*你已经改变了什么*和为什么*它应该工作? – codeMagic

+0

你是对的!请参阅编辑答案。通过将'runOnUiThread()'移出try..catch并更新catch以仅捕获线程中断,可以改进 –

+1

。鉴于全球渔获首先是问题的一部分。 –

1

您不应该在Thread中使用Toast。使用runOnUiThread代替:

this

@Override 
public void run(){ 

    try { 
     Thread.sleep(5000); 
     StringBuilder message=DisplaySensors(); 
     runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show(); 
        } 
       }); 

    } catch (Exception e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
}