2017-08-16 1 views
0

Was ist der beste Weg, um ein Benachrichtigungsbild zu laden?Die beste Methode, um ein Benachrichtigungsbild zu laden?

Hier ist mein aktueller Weg: Wie Sie sehen können, lädt das Bild synchron und somit kann die Benachrichtigung verzögert werden. Dies ist ein schlechter Weg.

public Bitmap getBitmapFromURL(String strURL) { 
    try { 
     URL url = new URL(strURL); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

Bitmap bitmap = getBitmapFromURL("https://graph.facebook.com/YOUR_USER_ID/picture?type=large"); 

// 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); 
builder.setContentIntent(pendingIntent); 

Ich brauche wirklich eine Antwort, um weiter an meinem Projekt zu arbeiten.

+0

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. –

Antwort

3

Denken Sie daran, wenn Sie etwas über das Internet laden, müssen Sie ein wenig warten. Es gibt mehrere Lösungen:

  1. laden ein Bild aus dem Internet wie in Ihrem Beispiel und zeigen.

  2. zeigen eine Stub-Bild und zeigen

  3. Verwenden Sie ein wenig durch die Aktualisierung der Mitteilung Bild später heruntergeladen, die Top-Cache Web-Zoll hilft. Zum Beispiel picaso

http://square.github.io/picasso/

0

Verwendung Picasso lib Bild laden von URL wie

Picasso.with(this.load(imageUri).into(imageview_id); 
0

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.

+0

Das ist die Art von Antwort, nach der ich gesucht habe.Aber bist du sicher, dass dies der richtige Weg ist, um Picasso zu benutzen? –

+0

Das ist nicht der "klassische" Weg, wo Ihre Referenz direkt Ihre imageView durch to in() -Methode ist, aber in Ihrem Fall müssen Sie das Bitmap-Ergebnis laden, da der Benachrichtigungsmanager keinen Zugriff auf die Bildansicht hat. Und mithilfe von Target können Sie mit Picasso asynchrone Bitmap-Ladeergebnisse erzielen. http://square.github.io/picasso/2.x/picasso/com/squareup/picasso/RequestCreator.html#into-com.squareup.picasso.Target- – smora

+0

Ich bekomme den Fehler 'java.lang.IllegalStateException: Method call sollte aus dem Hauptthread kommen. an dieser Zeile '.into (neues Target() {' –

Verwandte Themen