【问题标题】:Android timer and NetworkOnMainThreadExceptionAndroid 计时器和 NetworkOnMainThreadException
【发布时间】:2012-07-09 06:55:30
【问题描述】:

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

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。有人能说出这段代码有什么问题吗?

【问题讨论】:

    标签: android multithreading handler networkonmainthread


    【解决方案1】:

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

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

    了解 AsyncTask here

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您的代码 sn-p 应该如下所示。

        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);
            }
        };
        

        【讨论】:

          【解决方案4】:

          NetworkOnMainThreadException:

          当应用程序尝试执行 在其主线程上进行网络操作。

          因此您需要使用 ThreadrunOnUiThreadAsyncTaskHandlerHandlerThread 从后台线程更新 UI 元素。


          使用线程和 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();
          }
          

          【讨论】:

          • 我已经更新了示例代码,它是否有资格作为具有可运行 r 的单独线程来执行 n/w 操作?
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2012-12-14
            • 2017-09-29
            • 2012-11-16
            • 2015-01-01
            • 2021-03-21
            • 1970-01-01
            • 1970-01-01
            • 2018-12-15
            • 1970-01-01
            相关资源
            最近更新 更多