2015-05-13 4 views
-3

Я пытаюсь поместить файл throght WebDAV в андроиде,Каков наилучший способ решить android.os.NetworkOnMainThreadException

после я выполнить программу, то Logcat появляется android.os.NetworkOnMainThreadException

я было попробовать два способа sloves него, любит код ниже

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

сделать «работу» внутри AsyncTask – gmetax

+0

взгляд на 2-й ответ на SO сообщение, которое Вы данный – davidshen84

+0

Либо сделать сетевой задачи в AsyncTask или запустить код сети в новом потоке. –

ответ

2

android.os.NetworkOnMainThreadException

означает, что вы делаете некоторые Network job в MainThread. Однако любая работа в сети должно быть сделано в другом потоке, чем Main(UI Thread)

Вы должны переместить uploadFiles(sourceFilePath);метод к BackgroundThread. Как некоторые предлагаемые на комментарии вы можете использовать AsyncTask и двигаться, что метод к doInBackground()

0

hungwei0331,

Вы должны сделать свою работу внутри doInBackground() функции асинхронной задачи. Потому что, Network operations are time-consuming so you can't execute this function on activity thread.

Решение заключается в использовании asyncTask или thread.

0

Использование AsyncTask и выполнять сетевые операции в doInBackground.

0

Самый простой способ - это нить с присоединением. Это уродливо, но работоспособно.

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

t.Start(); 
t.Join(); 
Смежные вопросы