Чтение текстовых файлов с URL-адреса в EditText на Android Honeycomb, получение NetworkOnMainThreadException - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь написать фрагмент кода, который берет URL и отображает его текстовое содержимое в представлении EditText. Это не очень хорошо, я перебирал другие ссылки, которые, как я думал, давали ответ, такие как выполнение сетевых вызовов из AsyncTask, описанного здесь:

Сота Android: фрагмент не может запустить AsyncTask?

но это не похоже на работу. Это действительно одна функция (которая вызывает другую), это все, что я пытаюсь использовать здесь. Эти функции приведены для полноты:

  public static InputStream getInputStreamFromUrl(String url){
            InputStream contentStream = null;

            try{
              HttpClient httpclient = new DefaultHttpClient();
              HttpResponse response = httpclient.execute(new HttpGet(url));
              contentStream = response.getEntity().getContent();
            } catch(Exception e){
               e.printStackTrace();
            }
            return contentStream;
         }

  public static String getStringFromUrl(String url)  {
         BufferedReader br = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url)));

         StringBuffer sb = new StringBuffer();

         try{
          String line = null;

          while ((line = br.readLine())!=null){
           sb.append(line);
          }
         }catch (IOException e){
          e.printStackTrace();
         }
         return sb.toString();
  }

а это от моего:

private class FragmentHttpHelper extends AsyncTask<Void, Void, Boolean>{
         protected void onPostExecute(Boolean result) {
                    contractTextTxt.setText(getStringFromUrl(urlReferenceTxt.getText().toString()));
            }
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return true;
        }         
    }

Выполняется при нажатии кнопки для получения URL:

        retrieveURLReferenceBtn.setOnClickListener(new OnClickListener() {  
        public void onClick(View arg0) {
                new FragmentHttpHelper().execute();
        }
    });

Так что, поставив вещи в асинхронную задачу, я подумал, что собираюсь обойти соты 3.0 NetworkOnMainThreadException, но, похоже, нет. Есть идеи, что попробовать дальше?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

getStringFromUrl и getInputStreamFromUrl должны быть вызваны в doInBackground().Вместо возврата boolean из doInBackground() вы можете вернуть текст и установить для него текстовое представление в onPostExecute.только метод doInBackground() запускается в новом потоке, поэтому вам нужно выполнить все связанные с сетью вещи здесь и обновить пользовательский интерфейс в onPostExecute().

1 голос
/ 04 августа 2011

Похоже, вы не помещаете свои реальные сетевые вызовы в метод doInBackground в AsyncTask. Как правило, это то, что вы хотели бы сделать, и тогда будет вызван onPostExecute. Я думаю, что ваш onPostExecute вызывается, как только вы запускаете AsyncTask, потому что вы ничего не делаете в doInBackground.

Попробуйте переместить код HttpClient в метод doInBackground.

Из того, что я могу сказать, это работает так:

Нажатие кнопки> Вызывает AsyncTask> Ничего не происходит в фоновом потоке> вызывает postExecute, который пытается .setText (NETWORK CALL) ... который возвращается в ваш поток UI

Поправь меня, если я ошибаюсь. Может я вижу это неправильно?

...