Sie sollten zuerst Ihre Mitteilung ohne Bild oder Platzhalter benachrichtigen, dann laden Sie Ihre Bitmap mit eine AsyncTask, oder verwenden Sie Picasso und Target Callback.
Geben Sie Ihrer Erstellungsaufgabe den Ersteller, den Sie für die erste Benachrichtigung verwendet haben, wenn die Bitmap geladen ist, fügen Sie sie dem Ersteller hinzu und benachrichtigen Sie Ihre Benachrichtigung erneut.
Wenn das Risiko besteht, dass sich der Inhalt vor dem vollständigen Laden des Bildes geändert hat, speichern Sie eine Variable, die Ihren aktuellen Inhalt angibt, den Sie überprüfen können, bevor Sie ihn erneut aktivieren.
Sie können das Beispiel von MediaNotificationManager von google UniversalMusicPlayer Projekt verfolgen.
In Ihrem Fall:
// CONSTRUCT THE NOTIFICATION DETAILS
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("Some Title");
builder.setContentText("Some Content Text");
//builder.setLargeIcon(bitmap); // replace this line with place holder drawable from resources
builder.setContentIntent(pendingIntent);
manager.notify(NOTIFICATION_ID, builder.build());
currentLoadImageTask = new LoadImageTask(manager, builder);
currentLoadImageTask.execute("https://graph.facebook.com/YOUR_USER_ID/picture?type=large");
// ...
static class LoadImageTask extends AsyncTask<String, Void, Bitmap> {
final NotificationManager manager;
final NotificationCompat.Builder builder;
public LoadImageTask(final NotificationManager manager, final NotificationCompat.Builder builder) {
this.manager = manager;
this.builder = builder;
}
@Override
protected Bitmap doInBackground(final String... strings) {
if (strings == null || strings.length == 0) {
return null;
}
try {
final URL url = new URL(strings[0]);
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
final InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(final Bitmap bitmap) {
if (bitmap == null || manager == null || builder == null) {
return;
}
builder.setLargeIcon(bitmap);
manager.notify(NOTIFICATION_ID, builder.build());
}
}
Mit picasso:
// CONSTRUCT THE NOTIFICATION DETAILS
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("Some Title");
builder.setContentText("Some Content Text");
//builder.setLargeIcon(bitmap); // replace this line with place holder drawable from resources
builder.setContentIntent(pendingIntent);
manager.notify(NOTIFICATION_ID, builder.build());
// ...
Picasso.with(context)
.load("https://graph.facebook.com/YOUR_USER_ID/picture?type=large")
.resize(250, 250)
.into(new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) {
builder.setLargeIcon(bitmap);
manager.notify(NOTIFICATION_ID, builder.build());
}
@Override
public void onBitmapFailed(final Drawable errorDrawable) {
// Do nothing
}
@Override
public void onPrepareLoad(final Drawable placeHolderDrawable) {
// Do nothing
}
});
Wenn nicht in UiThread Sie ein Runnable erstellen und führen Sie es in Looper
final Handler uiHandler = new Handler(Looper.getMainLooper())
uiHandler.post(new Runnable() {
@Override
public void run() {
// Call from here
}
});
Picasso ist viel besser einfach weil man Cache benutzt.
Und ich empfehle Ihnen, die Größe jedes Bitmap zu ändern, das Sie in der Benachrichtigung festgelegt haben, weil es OutOfMemoryException leicht provozieren kann, wenn Sie nicht.
Stack Overflow ist kein Programmierwettbewerb. Wir benötigen Fragen, um eine spezifische, nachprüfbare Antwort zu erhalten. Nach "dem Besten" zu fragen wird nicht funktionieren. Sie müssen genau eingrenzen, was Sie mit "am besten" meinen. Was sind Ihre Anforderungen? Welche Einschränkungen haben Sie? Beschreibe die Lösung, nach der du suchst, und dann kann sie jemand bereitstellen. –