Правильный способ обновить ImageView в RemoteViews?

Я пытаюсь получить изображение с удаленного URL-адреса и поместить его в ImageView. Сам ImageView находится в виджете приложения, поэтому, насколько я понимаю, это означает, что он инкапсулирован в RemoteViews и не обрабатывается напрямую.

Но я никогда не смогу заставить виджет приложения отображать изображение. Я извлекаю изображение как растровое изображение с удаленного URL-адреса с использованием расширения AsyncTask, и кажется, что изображение извлекается нормально (в любом случае возвращается ненулевое растровое изображение), хотя пока не могу отобразить его для подтверждения,

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

Вот весь соответствующий код:

макет /new_app_widget.xml:

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

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:contentDescription="@string/content" />
</RelativeLayout>

соответствующий бит из NewAppWidget.java:

public class NewAppWidget extends AppWidgetProvider {

...

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
        int appWidgetId) {

    // Construct the RemoteViews object
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);

    String strURL = "http://example.com/YqLOSfr4.png";

    new ImageFetchAsyncTask(strURL, R.id.imageView).execute();
    // ^^^^^
    // in the above, I pass the URL and the id of the imageview, fetch
    // the bitmap, and in the onPostExecute() method I use
    // setImageViewBitmap(viewId, bitmap) to load the bitmap into the imageview
    // 
    // I don't have the code to hand, but I can provide it.  For now, someone
    // may be able to tell me somewhere else I'm doing something wrong

    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId, views);
}

}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mike.widgetapptest" >
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        android:debuggable="true"
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".NewAppWidget" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/new_app_widget_info" />
        </receiver>
    </application>

</manifest>

1 ответ

Решение

Классическая ошибка новичка... Я пытался сделать что-то сразу после асинхронной задачи, ожидая, что асинхронная задача завершена. Поэтому я переместил то, что зависит от результата асинхронной задачи, в метод onPostExecute() асинхронной задачи, и вуаля... изображение, отображаемое в моем виджете приложения!

Другие вопросы по тегам