0

我正在使用以下代码在特定时间后更新列表。

Myactivity {
    setTimer() {
        Runnable  r = new Runnable() {
            run() {
                if(!isListUpdated) {
                    update();//n/w operation
                } else {
                    show();//this is a UI operation
                    listupdated = false;
                }

                Handler.postDelayed(this,next); //repeat after next
            }

            new Thread(r).start();
        }
    } 
}

经过 2-3 次迭代后,它给出了NetworkOnMainThreadException. 有人能说出这段代码有什么问题吗?

4

5 回答 5

2

您不应该在 Main Thread 中进行网络操作。创建一个单独的线程并在那里进行 nw 操作。

您可以使用AsyncTaskService单独的线程。您将在哪里进行网络操作。并通过 BroadcastReceiver、Handler 或 AsyncTask 进行更新。

在此处阅读有关 AsyncTask的信息

于 2012-07-09T06:58:19.270 回答
2

当您尝试在主线程中执行网络操作时,通常会发生此异常。用于AsyncTask您的网络操作。

于 2012-07-09T06:59:11.050 回答
1

NetworkOnMainThreadException

当应用程序尝试在其主线程上执行网络操作时引发的异常。

所以你需要使用ThreadrunOnUiThreadAsyncTaskHandlerHandlerThread从后台线程更新 UI 元素。


使用 thread 和runOnUiThread的示例:

public void myThread(){
    Thread th=new Thread() {
        @Override
        public void run() {
            try
            {
                while(true) {
                    Current_Activity.this.runOnUiThread( new Runnable() {
                        @Override
                        public void run() {
                    //UPDATE UI FROM HERE
                        }
                    });
                }
            }catch (InterruptedException e) {
                // TODO: handle exception
            }
        }
    };

    th.start();
}
于 2012-07-09T07:07:59.460 回答
1

考虑使用runOnUiThread在非 UI 线程中执行 UI 操作。

您的代码片段应如下所示。

Runnable runnable = new Runnable() {

    public void run() {
        if (!isListUpdated) {
            runOnUiThread(new Runnable() {

                public void run() {
                    update(); //n/w operation

                }
            });

        } else {
            runOnUiThread(new Runnable() {

                public void run() {
                    show(); //n/w operation

                }
            });
            listupdated = false;
        }

        handler.postDelayed(runnable, next);
    }
};
于 2012-07-09T07:07:42.297 回答
0

我猜您使用的是蜂窝版本,您最好使用 AsyncTask 它将解决您的问题。

于 2012-07-09T07:08:10.957 回答