Android 我的线坏了
我正在尝试合并我在网上找到的两个简单应用程序。我有一个线程,5秒钟后,我的传感器列表应该会显示一条Toast消息。但是什么也没有发生。线程不工作,我想我把一切都搞糟了。你能帮我一下吗。我真的很感激Android 我的线坏了,android,sensors,Android,Sensors,我正在尝试合并我在网上找到的两个简单应用程序。我有一个线程,5秒钟后,我的传感器列表应该会显示一条Toast消息。但是什么也没有发生。线程不工作,我想我把一切都搞糟了。你能帮我一下吗。我真的很感激 public class MainActivity extends Activity{ List<String>sName=new ArrayList<String>(); @Override protected void onCreate(Bundl
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();
}
公共类MainActivity扩展活动{
ListsName=newarraylist();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(这个“Loadingg”,Toast.LENGTH_LONG).show();
线程thr=新线程(){
@凌驾
公开作废运行(){
试一试{
睡眠(5000);
StringBuilder消息=DisplaySensors();
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG.show();
}捕获(例外e){
//TODO:处理异常
}
}
私有StringBuilder DisplaySensors(){
SensorManager sm=(SensorManager)getSystemService(Context.SENSOR\u服务);
ListsList=sm.getSensorList(Sensor.TYPE\u ALL);
StringBuilder sb=新的StringBuilder();
对于(int i=0;i所有UI操作都必须在主UI线程上运行。因此,如果要显示toast消息,则不应在单独的线程中执行。在这种情况下,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();
}
公共类MainActivity扩展活动{
ListsName=newarraylist();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(这个“Loadingg”,Toast.LENGTH_LONG).show();
线程thr=新线程(){
@凌驾
公开作废运行(){
试一试{
睡眠(5000);
StringBuilder消息=DisplaySensors();
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG.show();
}
});
}捕获(例外e){
//TODO:处理异常
}
}
私有StringBuilder DisplaySensors(){
SensorManager sm=(SensorManager)getSystemService(Context.SENSOR\u服务);
ListsList=sm.getSensorList(Sensor.TYPE\u ALL);
StringBuilder sb=新的StringBuilder();
对于(int i=0;i您不应在线程中使用Toast
。请改用runOnUiThread
:
看
你在一个线程中显示Toast
,这是错误的。它会崩溃吗?不会,也不会。它不会崩溃,因为你有一个未处理的try catch。你能不能向OP和其他人解释一下你改变了什么以及为什么它会工作?可以通过移动rununuithread()来改进一下
out the try..catch&更新catch以仅捕获线程中断。考虑到全局捕获首先是问题的一部分。萨奥尔·奥努雷·塔马德尔
@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();
}
}