我们正在尝试构建一个每秒钟左右记录分贝级别的应用程序。问题是我们需要在run()方法中有一个无限循环来轮询分贝级别,但是当我们添加无限循环时,它会挂起。有人能指出我们正确的方向吗?感谢。
以下是代码:
package tpsip.tpsip;
import android.app.Activity;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Button;
import android.widget.TextView;
public class tpsip extends Activity implements Runnable{
private TextView decibelMeter;
private TextView timeRemaining;
private Button button;
private int safetyTime;
ExposureCalculator calculator = new ExposureCalculator();
Handler handler = new Handler();
Thread thread = new Thread();
LogicLayer logicLayer = new LogicLayer();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
this.safetyTime = 28800; //8 hours of safe time when the decibel level is between 90-92, levels below this are not considered dangerous to hearing
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.decibelMeter = (TextView)findViewById(R.id.textView2);
this.decibelMeter.setText("0 dB");
this.timeRemaining = (TextView)findViewById(R.id.textView3);
this.timeRemaining.setText("Safety time remaining " + safetyTime + " seconds");
this.button = (Button) findViewById(R.id.button1);
button.setBackgroundColor(Color.GREEN);
button.setText("Ear protection not needed");
handler.post(thread);
this.run();
}
@Override
public void run() {
int a = 10;
while(true) {
this.decibelMeter.setText("0safsafsafa dB");
if (a == Math.random() * 100) break;
}
}
}
答案 0 :(得分:1)
在另一个线程上运行opertaion,并在需要时使用处理程序或runOnUIThread()
更改UI。目前,该方法被称为regullar方法,并在无限循环中运行,不会让您的UI更新。
答案 1 :(得分:1)
您是否在UI线程中运行无限循环?这是你绝对不能做的事情。应用程序将变得无响应并“挂起”,因为它无法再从操作系统获取消息。使用另一个线程来运行循环。
最简单的方法是添加一个扩展Thread
的类并将“run”方法放在那里。但是,请记住,您无法从其他线程访问UI。
答案 2 :(得分:0)
与其他人所说的一样,您不能在Main / UI线程上运行长时间运行的操作。您的应用已锁定,因为onCreate()永远无法返回并更新用户界面。
使用AsyncTask代替: http://developer.android.com/reference/android/os/AsyncTask.html