2013-09-09 2 views
0

Я пытаюсь сохранить веб-страницу, чтобы мой внешний хранения со следующим методом:Сохранение веб-страницы на внешнее устройство хранения аварий приложение

public void saveWebPage(String url, String fileName){ 
    try { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse response; 
     response = httpClient.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null){ 
      sb.append(line + "\n"); 
     } 
     String resString = sb.toString(); 
     is.close(); 
     File file = new File(Environment.getExternalStorageDirectory().toString() + "/Android/data/com.whizzapps.stpsurniki/" + fileName + ".html"); 
     file.createNewFile(); 
     FileOutputStream f1 = new FileOutputStream(file, false); 
     PrintStream p = new PrintStream(f1); 
     p.print(resString); 
     p.close(); 
     f1.close(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Когда я вызываю метод, приложение аварий и это LogCat:

09-09 17:26:22.304: E/AndroidRuntime(14507): FATAL EXCEPTION: main 
09-09 17:26:22.304: E/AndroidRuntime(14507): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.whizzapps.stpsurniki/com.whizzapps.stpsurniki.Scheudele}: android.os.NetworkOnMainThreadException 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.os.Looper.loop(Looper.java:137) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread.main(ActivityThread.java:5103) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at java.lang.reflect.Method.invokeNative(Native Method) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at java.lang.reflect.Method.invoke(Method.java:525) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at dalvik.system.NativeStart.main(Native Method) 
09-09 17:26:22.304: E/AndroidRuntime(14507): Caused by: android.os.NetworkOnMainThreadException 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at com.whizzapps.stpsurniki.Scheudele.saveWebPage(Scheudele.java:135) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at com.whizzapps.stpsurniki.Scheudele.getWebView(Scheudele.java:66) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at com.whizzapps.stpsurniki.Scheudele.onCreate(Scheudele.java:50) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.Activity.performCreate(Activity.java:5133) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
09-09 17:26:22.304: E/AndroidRuntime(14507): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
09-09 17:26:22.304: E/AndroidRuntime(14507): ... 11 more 

мне сказали, чтобы поместить это в UI тему, но я не знаю, в какой строке кода пользовательский интерфейс нить. Я просто поставил его рядом с другими методами в файле класса активности.

Новый код:

private class downloadWebPage extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      HttpResponse response; 
      response = httpClient.execute(httpGet); 
      HttpEntity entity = response.getEntity(); 
      InputStream is = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null){ 
       sb.append(line + "\n"); 
      } 
      String resString = sb.toString(); 
      is.close(); 
      File file = new File(Environment.getExternalStorageDirectory().toString() + "/Android/data/com.whizzapps.stpsurniki/" + fileName + ".html"); 
      file.createNewFile(); 
      FileOutputStream f1 = new FileOutputStream(file, false); 
      PrintStream p = new PrintStream(f1); 
      p.print(resString); 
      p.close(); 
      f1.close(); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 
+0

Google 'NetworkOnMainThreadException'. Короче: используйте AsyncTask для сетевых задач. – Ahmad

ответ

0

Исключение четко указывает android.os.NetworkOnMainThreadException, что означает, что вы всегда должны сделать Network вызов только в отдельном потоке.

Создать новую тему и сделать Network звонок.

Вы можете использовать AsyncTask, The AsyncTask class provides one of the simplest ways to fire off a new task from the UI thread из Android документации

Смотрите android link для получения дополнительной информации.


Прочитайте документацию относительно AsyncTask тщательно.

Три типа, используемый асинхронная задача являются следующим:

  1. Params, типа параметров, посланных к задаче при выполнении.
  2. Прогресс, тип единиц прогресса, опубликованных во время вычисления фона.
  3. Результат, тип результата вычисления фона

В вашем случае, вы должны использовать Params для отправки параметра методы (например URL и имя файла)

+0

Благодарим вас за ответ. Не могли бы вы проверить мой новый код? Я редактировал свой оригинальный пост. У меня есть еще одна проблема. Как объявить строку «url» и «fileName» сейчас? Раньше у меня это было в методе типа methodName (String url, String fileName), но где я их сейчас ставил? – Guy

+0

Если его просто закодированное значение, то прямо в ваш метод 'doiInBackground'. –

+0

Нет, значение url и fileName меняется в зависимости от того, какую кнопку я нажимаю. – Guy