1

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

我相信让程序每秒刷新一次,我执行一个 while 循环,其中 while 条件始终为“真”,在 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'
4

2 回答 2

3

你永远不想调用它看起来像你在这里做的事情Thread.sleep()UI Thread您可以将其放入您Thread创建并用于runOnUiThread()更新您的TextView

这是一个可能有帮助的答案

这个看起来也像你在做什么

于 2013-06-27T15:56:08.530 回答
1

永远不要阻塞 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();
于 2013-06-27T15:55:26.493 回答