2016-05-21 4 views
2

Я новичок в программировании на Android и работаю над приложением, в котором я хочу сохранить изображение с URL-адреса на SD-карту, когда пользователь нажимает кнопку.Сохранить изображение на SD-карту с url throws NetworkOnmainThread Exception in android

Я нашел для него метод и использовал его, но он выбрасывает NetworkOnMainThread исключения, приводящие к сбою приложения. Что я делаю не так?

Вот мой код:

void DownloadPost(){ 
     try 
     { 
      URL url = new URL(mPost.postImagePath); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoOutput(true); 
      urlConnection.connect(); 
      File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile(); 
      String filename="downloadedFile.png"; 
      Log.i("Local filename:",""+filename); 
      File file = new File(SDCardRoot,filename); 
      if(file.createNewFile()) 
      { 
       file.createNewFile(); 
      } 
      FileOutputStream fileOutput = new FileOutputStream(file); 
      InputStream inputStream = urlConnection.getInputStream(); 
      int totalSize = urlConnection.getContentLength(); 
      int downloadedSize = 0; 
      byte[] buffer = new byte[1024]; 
      int bufferLength = 0; 
      while ((bufferLength = inputStream.read(buffer)) > 0) 
      { 
       fileOutput.write(buffer, 0, bufferLength); 
       downloadedSize += bufferLength; 
       Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; 
      } 
      fileOutput.close(); 
      Toast.makeText(PostListItem.this.getContext(),"Post saved to gallery",Toast.LENGTH_SHORT).show(); 
     } 
     catch (MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      // filepath=null; 
      e.printStackTrace(); 
     } 
     // Log.i("filepath:"," "+filepath) ; 
    } 
+0

показать свой полный код. – Amy

ответ

1

Вы не можете запустить основную тему сетевого запроса.

 AsyncTask asyncTask=new AsyncTask() { 
      @Override 
      protected Object doInBackground(Object[] params) { 
       DownloadPost(); 
      } 
     }; 
     asyncTask.execute(); 

Или используйте Thread:

Thread thread = new Thread(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     try 
     { 
      DownloadPost(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 

thread.start(); 
+0

perfect ... Спасибо ahmad..saved мой день брата –

+0

Ваш wellcome. –

0

На самом деле вы звоните DownloadPost из главного потока, как OnCreate или onResume. Сделайте один AsyncTask и вызовите метод DownloadPost от doInBackGround.

Android не разрешает работать в сети из основного потока, так как вам нужно называть его из фона.

Надеюсь, это вам поможет.

0

Исключение, которое вызывается, когда приложение пытается выполнить операцию сети на ее главном потоке.

Это только для приложений, предназначенных для SDK Honeycomb или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено создавать сети по своим основным потокам цикла событий, но это сильно обескураживает. См. Документ Designing for Responsiveness

Также см. StrictMode.

1

Вы должны использовать AsyncTask:

AsyncTask<Void, Void, Boolean> asyncTask = new AsyncTask<Void, Void, Boolean>() { 


    @Override 
    protected Boolean doInBackground(Void... params) { 
     return DownloadPost(); 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     super.onPostExecute(aBoolean); 

     if (aBoolean) 
      // UI Positive feedback 
     else 
      // UI Negative feedback 
    } 
}; 

убедитесь Скачать() возвращает логический результат для управления обратной связи в onPostExecute().

doInBackground() для бизнес-логики (не UI), onPostExecute() работы на потоке пользовательского интерфейса

 Смежные вопросы

  • Нет связанных вопросов^_^