什么是解决android.os.NetworkOnMainThreadException的最佳方法

时间:2015-05-13 08:45:44

标签: android

我正在尝试将文件throght webdav放入android,

执行程序后,Logcat出现android.os.NetworkOnMainThreadException

我试过两种方法来解决它,喜欢下面的代码

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

和这一个

        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
        .detectDiskReads()  
        .detectDiskWrites()  
        .detectNetwork()   // or .detectAll() for all detectable problems  
        .penaltyLog()  
        .build());  
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
        .detectLeakedSqlLiteObjects()  
        .detectLeakedClosableObjects()  
        .penaltyLog()  
        .penaltyDeath()  
        .build());  

它可以工作,但这些方式迫使我的项目关闭,

所以我认为它不适合在我的项目上使用

之后我就对它进行了研究,

每个人都推荐这种方式来解决它

android.os.NetworkOnMainThreadException. How to solve it?

但我是初学者,我不知道如何填写我的代码,

我想知道如何以这种方式填写我的代码,

提前感谢您提供此处提供的任何帮助。

         loginConfirmBtn.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View v) {
                ConnectivityManager connMgr = (ConnectivityManager) 
                    getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                    if (networkInfo != null && networkInfo.isConnected()) {

                        getIpAddress = ipAddress.getText().toString().trim();
                        getUserName = userName.getText().toString().trim();
                        getPassWord = passWord.getText().toString().trim();

                        uploadFiles(sourceFilePath);

                        Toast.makeText(MainActivity.this, "upload suseeful", Toast.LENGTH_SHORT).show();
                        hideKeyboard();

                    } else {

                        Toast.makeText(MainActivity.this, "make sure you have connected the internet", Toast.LENGTH_SHORT).show();                          
           }

        public void uploadFiles(String dir){
            Log.d("edoc","PutRunGenuine");
            String fileFromEscan = dir;

            Conn conn_adv = new Conn(new Constants(getUserName, getPassWord, getIpAddress, 80));                                conn_adv.setUrl("/collab/my/"+conn_adv.getUser()+"/sourceFilePath2");
            Log.d("edoc","edoc test");
               if (fileFromEscan == null) 
               {
                   return;
               }
               try {                 
               String putAvg = "PUT avg: ";
               ExtractedMethod exm =  new ExtractedMethod();
               exm.run(HTCode.Code.PUT, 1, conn_adv, true, fileFromEscan, 1000, true);

               Log.d("edoc","edoc_message hello");
               synchronized(conn_adv){
                   conn_adv.notify();                           
               }

               } catch (Exception io) {
                   io.printStackTrace();
                   Log.d("edoc","edoc Exception"+io);
                 }
           }

4 个答案:

答案 0 :(得分:2)

  

android.os.NetworkOnMainThreadException

表示您在Network job中执行了一些MainThread。但是,任何网络作业都应该在Main(UI Thread)

之外的其他线程中完成

您必须将uploadFiles(sourceFilePath); 方法移至BackgroundThread。正如有些人在评论中建议的那样,您可以使用AsyncTask并将方法移至doInBackground()

答案 1 :(得分:0)

hungwei0331,

您必须在异步任务的doInBackground()函数内完成工作。 因为, Network operations are time-consuming so you can't execute this function on activity thread.

解决方案是使用asyncTaskthread

答案 2 :(得分:0)

使用 AsyncTask 并在 doInBackground 中执行网络操作。

答案 3 :(得分:0)

最简单的方法是使用加入线程。它很难看但可行。

Thread t = new Thread(new Runnable() {
  public void run() {
    //do all here
    });
  }
});

t.Start();
t.Join();