java
  • android
  • android-asynctask
  • 2014-11-24 5 views 0 likes 
    0

    В AsyncTask я получаю json с некоторыми значениями в виде изображений. Ниже приведен пример моего JSONКак загрузить изображения из html в AsyncTask

    { 
        "text": "some text", 
        "html1": "Hi, check out my fb profile picture at <img src = 'http:\/\/abc.com/image1.png'\/> ", 
        "html2": "Hi, check out my whatsapp profile picture at <img src = 'http:\/\/abc.com\/image1.png'\/> ", 
        . 
        . 
        . 
    } 
    

    В асинхронной задачи postExecute метод, который я

    ((TextView) findViewById(R.id.html1)).setText(Html.fromHtml((String) jsonObj.get("html1"), new ImageGetter() 
    { 
        @Override 
        public Drawable getDrawable(String source) 
        { 
         return loadImage(source); 
        } 
    }, null)); 
    ((TextView) findViewById(R.id.html2)).setText(Html.fromHtml((String) jsonObj.get("html2"), new ImageGetter() 
        { 
         @Override 
         public Drawable getDrawable(String source) 
         { 
          return loadImage(source); 
         } 
        }, null)); 
    

    и мой метод LoadImage выглядит, как показано ниже

    private Drawable loadImage(String source) 
        { 
         Drawable drawable = null; 
         URL sourceURL; 
         try 
         { 
          sourceURL = new URL(source); 
          URLConnection urlConnection = sourceURL.openConnection(); 
          urlConnection.connect(); 
          InputStream inputStream = urlConnection.getInputStream(); 
          BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
          Bitmap bm = BitmapFactory.decodeStream(bufferedInputStream); 
    
          // convert Bitmap to Drawable 
          drawable = new BitmapDrawable(getResources(), bm); 
    
          drawable.setBounds(0, 0, bm.getWidth(), bm.getHeight()); 
    
         } 
         catch (MalformedURLException e) 
         { 
          e.printStackTrace(); 
         } 
         catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
         return drawable; 
        } 
    

    Я думаю, что код хватай, но я я получаю android.os.NetworkOnMainThreadException

    Я добавил разрешения Интернет в Manifest.xml

    +0

    пожалуйста, вы можете отлаживать к конкретной строке, когда аварии код? – ymz

    +0

    @ urlConnection.connect(); –

    +0

    Я не уверен, но, вероятно, вы не должны работать с сетью в методе onPostExecute. И единственный метод в AsyncTask, где вы можете это сделать, - метод doInBackground. Это может вызвать android.os.NetworkOnMainThreadException. – antonpp

    ответ

    0

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

    public class MainActivity extends Activity implements ImageGetter { 
     
        private final static String TAG = "MainActivity"; 
     
        private TextView mTv; 
     
    
     
        @Override 
     
        public void onCreate(Bundle savedInstanceState) { 
     
         super.onCreate(savedInstanceState); 
     
         setContentView(R.layout.activity_main); 
     
         String source = <your source from json here>; 
     
    
     
         Spanned spanned = Html.fromHtml(source, this, null); 
     
         mTv = (TextView) findViewById(R.id.text); 
     
         mTv.setText(spanned); 
     
        } 
     
    
     
        @Override 
     
        public Drawable getDrawable(String source) { 
     
         LevelListDrawable d = new LevelListDrawable(); 
     
         Drawable empty = getResources().getDrawable(R.drawable.ic_launcher); 
     
         d.addLevel(0, 0, empty); 
     
         d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight()); 
     
    
     
         new LoadImage().execute(source, d); 
     
    
     
         return d; 
     
        } 
     
    
     
        class LoadImage extends AsyncTask<Object, Void, Bitmap> { 
     
    
     
         private LevelListDrawable mDrawable; 
     
    
     
         @Override 
     
         protected Bitmap doInBackground(Object... params) { 
     
          String source = (String) params[0]; 
     
          mDrawable = (LevelListDrawable) params[1]; 
     
          Log.d(TAG, "doInBackground " + source); 
     
          try { 
     
           InputStream is = new URL(source).openStream(); 
     
           return BitmapFactory.decodeStream(is); 
     
          } catch (FileNotFoundException e) { 
     
           e.printStackTrace(); 
     
          } catch (MalformedURLException e) { 
     
           e.printStackTrace(); 
     
          } catch (IOException e) { 
     
           e.printStackTrace(); 
     
          } 
     
          return null; 
     
         } 
     
    
     
         @Override 
     
         protected void onPostExecute(Bitmap bitmap) { 
     
          Log.d(TAG, "onPostExecute drawable " + mDrawable); 
     
          Log.d(TAG, "onPostExecute bitmap " + bitmap); 
     
          if (bitmap != null) { 
     
           BitmapDrawable d = new BitmapDrawable(bitmap); 
     
           mDrawable.addLevel(1, 1, d); 
     
           mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     
           mDrawable.setLevel(1); 
     
           // i don't know yet a better way to refresh TextView 
     
           // mTv.invalidate() doesn't work as expected 
     
           CharSequence t = mTv.getText(); 
     
           mTv.setText(t); 
     
          } 
     
         } 
     
        } 
     
    }

    Или: Добавить код StrictMode в OnCreate под setContentView (...);

    StrictMode.ThreadPolicy policy = new 
     
    StrictMode.ThreadPolicy.Builder() 
     
    .permitAll().build(); 
     
    StrictMode.setThreadPolicy(policy);

    Но добавление StrictMode.ThreadPolicy плохая практика

    0

    это похоже, что формат JSON для URL вызывает все неприятности

    есть большой пост по этому вопросу: Decode Json urls

    но это в конечном итог с неработающими ссылками .. поэтому .. немного прибегая к помощи вокруг и: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html

    вы должны экранирование в вашей строке URL-адрес с помощью функции unescapeJavaScript, чтобы получить правильный URL-адрес

    +0

    извините, что это не проблема. Я пробовал уже –

    +0

    любой шанс поделиться внутренним сообщением исключения? – ymz

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