2016-05-25 11 views
0

I 2 Aktivitäten haben, i) MainActivity ii) FavoriteActivity und eine nicht-Aktivitätsklasse Radioservice. Beide Aktivitäten hava eine identische Methode - notifyShowBar(), zeigt eine Textleiste in [email protected] definiert.Android Aktivität: aktualisiert in regelmäßigen Abständen sowohl Aktivität Text aus derselben Datenquelle

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

@Override 
protected void onResume() { 
    super.onResume(); 
    notifyShowBar(); 
} 
public void notifyShowBar() { 
.... 
    textView.setText(revs.getMeta()); 
.... 
} 
..... 

FavoriteActivity.java

public class FavoriteActivity extends AppCompatActivity implements View.OnClickListener { 

@Override 
protected void onResume() { 
    super.onResume(); 
    notifyShowBar(); 
} 
public void notifyShowBar() { 
.... 
    textView.setText(revs.getMeta()); 
.... 
} 
..... 

Nun, wenn eine Aktivität Radioservice nennt, hat es eine Timertask erstellt, es Informationen vom Server regelmäßig dann holen, und zeigt bar in übergeordneter Aktivität . Die Leiste zeigt also alle 15 Sekunden aktualisierte Informationen an.

private class ProgressTask extends AsyncTask<String, Void, Boolean> { 

    @Override 
    protected void onPostExecute(final Boolean success) { 
      updateMeta(); 
      .... 
    } 

    public void updateMeta() { 
    timerAsync = new Timer(); 
    timerTaskAsync = new TimerTask() { 
     @Override 
     public void run() { 
       ((Activity)context).runOnUiThread(new Runnable() { 
       @Override public void run() { 
        // get and set meta data here and then call createShowBar 
        createShowBar(); 
       } 
      }); 
     } 
    }; 
    timerAsync.schedule(timerTaskAsync, 0, 15000); 
    } 

    private void createShowBar() { 
    if (RadioService.inwhich == 2) { 
     ((FavoriteActivity) context).notifyShowBar(); 
    } else { 
     ((MainActivity) context).notifyShowBar(); 
    } 
    } 
..... 
} 

Problem ist, wenn ich einen Knopf in MainActivity auszuführen, den Radioservice aufruft, zeigt es eine Bar und Updates dort in regelmäßigen Abständen. Wenn ich jedoch zu FavoriteActivity blättere, wird die Leiste angezeigt, aber nicht regelmäßig aktualisiert. Wie kann ich es für beide Aktivitäten möglich machen? Vielen Dank.

Antwort

1

Verwenden Sie eine BroadcastReceiver. Sie können einen mit einem Intent-Filter registrieren und dann Intents empfangen, die mit sendBroadcast gesendet wurden. Wenn Sie nur aktualisieren möchten, während die App sichtbar ist, registrieren Sie den Empfänger onStart und entfernen Sie die Registrierung onStop.

public class FavoriteActivity extends AppCompatActivity { 
    private static final String ACTION_UPDATE = "Something unique"; 

    private static final IntentFilter FILTER = new IntentFilter(ACTION_UPDATE); 

    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // do your thing 
     } 
    }; 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     registerReceiver(receiver, FILTER); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     unregisterReceiver(receiver); 
    } 
} 

eine Sendung mit

Intent intent = new Intent(ACTION_UPDATE); 
// add data to intent 
sendBroadcast(intent); 

auch senden, schauen Sie sich LocalBroadcastManager auf eine sicherere Art und Weise, dies zu tun.

+0

Danke für den Vorschlag. Der Benutzer kann RadioService auch von FavoriteActivity aus starten! Dann erstellt RadioService eine Timertask und startet die Aktualisierung der Leiste auf FavoriteActivity in regelmäßigen Abständen. Also keine regelmäßigen Updates auf MainActivity. Es ist eine Situation umgekehrt. Was ist zu tun? –

+1

Eine Sendung ist ein Feuer-und-Vergessen-Ding. Du sendest eins, und jemand kann es empfangen, wenn sie zuhören. Sie können beide Aktivitäten hören, eine von ihnen oder keine. – DariusL

+0

Danke, es hat perfekt funktioniert. Du bist Retter: D –

5

Das kann mit der einfachen Vererbungsregel gemacht werden. Erstellen Sie abstract BaseActivity mit einer abstrakten Methode notifyShowBar, die die AppCompatActivity erweitert. Verwenden Sie MainActivity & FavoriteActivity als untergeordnete Klassen von BaseActivity. Da aufgrund der Regel der Abstraktion, würde die notifyShowBar Methode haben in MainActivity & FavoriteActivity umgesetzt werden, so, wenn Sie notifyShowBar in BaseActivity nennen es das gleiche in den Klassen

Kind nenne ich ein
+0

kannst du das bitte mit Basis-Aktivitätscode erklären? Entschuldigung für mein Anfänger-Englisch. Vielen Dank. –

+0

http://paste.ubuntu.com/16690460/ etwas wie das – Rahul

+0

Danke für die Paste.Ich habe es ausprobiert, es zeigt wie üblich in jeder Aktivität eine Textleiste, aktualisiert aber nur, wo es erstellt wurde. Also zurück zum ursprünglichen Problem. Zum Beispiel, wenn ich diesen Radioservice aus favoriteactivity erstelle, wird er nur periodisch auf favoriteactivity aktualisiert, nicht auf der Hauptseite. Hier ist meine aktualisierte Version des Codes: http://pastebin.com/JmNthAkp –

0

Für meine App ähnliches Problem verwendet Service unabhängig von Aktivitäten + Square's Otto bus. Der Service bucht verschiedene Ereignisse in den Bus, Aktivitäten abonnieren diese Businstanz und Ereignistypen und führen entsprechende Aktionen durch.