Ошибка растрового изображения виджета Android - PullRequest
0 голосов
/ 03 мая 2018

Все было в порядке, когда я тестировал свой виджет с помощью эмуляторов, но когда я пытаюсь протестировать его на реальном устройстве (HTC Desire 816g), я получаю следующую ошибку при загрузке изображения из URL. Это ошибка:

05-03 12:15:21.679 24313-24393/com.example.macos.ladderapp D/dalvikvm: Alloc : 11653456
05-03 12:15:21.680 24313-24393/com.example.macos.ladderapp I/dalvikvm: "AsyncTask #2" prio=5 tid=31 RUNNABLE
      | group="main" sCount=0 dsCount=0 obj=0x424d34d0 self=0x637abb60
      | sysTid=24393 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1668947712
      | state=R schedstat=( 93174539 4489846 39 ) utm=9 stm=0 core=1
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-03 12:15:21.682 24313-24393/com.example.macos.ladderapp I/dalvikvm:     at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649)
        at com.example.macos.ladderapp.RetrieveFeedTask.doInBackground(RetrieveFeedTask.java:57)
        at com.example.macos.ladderapp.RetrieveFeedTask.doInBackground(RetrieveFeedTask.java:25)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

А это код Java:

protected void onPostExecute(Bitmap bm) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mcontext);
    RemoteViews remoteViews = new RemoteViews(mcontext.getPackageName(), R.layout.simple_widget);
    remoteViews.setImageViewBitmap(R.id.REKLAM, bm);
    appWidgetManager.updateAppWidget(new ComponentName(mcontext, SimpleWidgetProvider.class), remoteViews);

}

@Override
protected Bitmap doInBackground(Context... contexts) {
     Bitmap bm = null;
    try {
        URL aURL = new URL(mLink);
        URLConnection conn = aURL.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        bm = BitmapFactory.decodeStream(bis);
        bis.close();
        is.close();
} catch (IOException e) {
    Log.e(TAG, "Error getting bitmap", e);
}
return bm;
}

Это файл макета виджета, и я думаю, что он вызывает

Проблема с загрузкой виджета ошибка. Я пытаюсь загрузить изображение (REKLAM) и в верхнем левом углу кликабельный вектор стрелки (клик).

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/widget_margin"
>

    <ImageView
        android:id="@+id/clickview"
        android:layout_width="50dp"
        android:alpha="0.84"
        android:layout_alignLeft="@id/REKLAM"
        android:src="@drawable/ic_widget_arrow_24dp"
        android:layout_height="40dp" />

    <ImageView
        android:id="@+id/REKLAM"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />


</RelativeLayout>

1 Ответ

0 голосов
/ 03 мая 2018

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

Библиотека, которую Google рекомендует для обработки изображений, - Glide. Он поставляется с удобным классом, специально предназначенным для отображения представлений изображений в виджетах приложений: AppWidgetTarget.

AppWidgetTarget awt = new AppWidgetTarget(context, R.id.img_dog, remoteViews, appWidgetIds) {
    @Override
    public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
        super.onResourceReady(resource, transition);
    }
};

RequestOptions options = new RequestOptions().
        override(300, 300).placeholder(R.drawable.placeholder_img).error(R.drawable.error_img)


Glide.with(context.getApplicationContext())
        .asBitmap()
        .load(imageUrl)
        .apply(options)
        .into(awt);

В Gradle необходимо добавить следующие строки:

implementation 'com.github.bumptech.glide:glide:4.7.1'
kapt 'com.github.bumptech.glide:compiler:4.7.1'

Образцы скольжения и источник

Учебник по скольжению

Но, что касается исключения, этот пост объясняет некоторые ошибки при работе с растровыми изображениями:

Странно нехватка памяти при загрузке изображения в растровый объект

С Glide можно изменять размеры изображений с помощью функции override (), показанной выше.

Также 2 близких звонка:

bis.close();
is.close();

Нужно поместить в блок наконец. Каждый раз, когда close () вызывается в операторе try, будь то поток, курсор или другой ресурс, это должен быть потенциальный красный флаг. Почти всегда лучше позиционировать их в конечном итоге.

Закрытие потоков ввода / вывода при уничтожении

...