我正在尝试制作一个监控网络连接的程序,一个显示状态和带宽并每秒刷新一次的程序。昨天我了解到网络监控发生在我创建的辅助线程上;它现在有效。
我相信让程序每秒刷新一次,我做一个while循环,其中while条件总是“true”,而在while循环结束时我“尝试”一个Thread.sleep(1000) )。
我有一个问题和一个问题。
问题:我是否冒着充斥我的计划的风险?我觉得通过设置secondaryThread = null,在while循环期间创建的所有数据都会被垃圾收集,但我不确定是否是这种情况。
问题:当我运行这个时,我收到一条消息“[程序]意外退出”......让我觉得我确实充斥了程序。有办法解决这个问题吗?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int linkSpeed = -1;
TextView textView = new TextView(this);
while (true)
{
SecondaryThread secondaryThread = new SecondaryThread(this);
new Thread(secondaryThread).start();
linkSpeed = secondaryThread.getLinkSpeed();
secondaryThread = null;
// Create the text view
textView.setTextSize(25);
textView.setText("linkspeed = " + linkSpeed);
// Set the text view as the activity layout
setContentView(textView);
try {
Thread.sleep(1000);
}
catch (Exception e) {
textView.setTextSize(25);
textView.setText("oh shit");
}
}
LogCat跟踪堆栈表示一切正常,即使这不是实际情况。具体来说,它说以下......
06-27 15:07:58.069: D/gralloc_goldfish(1312): Emulator without GPU emulation detected.
06-27 15:41:45.879: I/dalvikvm(1919): threadid=3: reacting to signal 3
06-27 15:41:45.958: I/dalvikvm(1919): Wrote stack traces to '/data/anr/traces.txt'
答案 0 :(得分:2)
你永远不想在Thread.sleep()
上打电话给你UI Thread
。您可以将其添加到您创建的Thread
中,并使用runOnUiThread()
更新TextView
Here is a SO answer可能会有所帮助
答案 1 :(得分:0)
永远不要阻止UI线程。使用后台线程:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final TextView textView = new TextView(this);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
int globalState = 1;
while (true) {
// <cut>
// Create the text view
// new scope
{
final int linkSpeed = ++globalState;
textView.post(new Runnable() {
@Override
public void run() {
textView.setTextSize(25);
textView.setText("linkspeed = " + linkSpeed);
// Set the text view as the activity layout
setContentView(textView);
}
});
}
try {
Thread.sleep(1000);
} catch (Exception e) {
textView.post(new Runnable() {
@Override
public void run() {
textView.setTextSize(25);
textView.setText("oh XXXX");
}
});
}
}
}
}.execute();