Thread.sleep导致android程序崩溃

时间:2013-06-27 15:51:54

标签: java android network-programming sleep thread-sleep

我正在尝试制作一个监控网络连接的程序,一个显示状态和带宽并每秒刷新一次的程序。昨天我了解到网络监控发生在我创建的辅助线程上;它现在有效。

我相信让程序每秒刷新一次,我做一个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'

2 个答案:

答案 0 :(得分:2)

你永远不想在Thread.sleep()上打电话给你UI Thread。您可以将其添加到您创建的Thread中,并使用runOnUiThread()更新TextView

Here is a SO answer可能会有所帮助

This one also looks like what you are doing

答案 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();