(HINWEIS, dass ich am Ende dieser Frage haben eine EDIT, in dem ich eine Methode mit ersetzt haben, was die Antwort sagte zu tun, um das Problem zu beheben von onReceive
nie und hinzugefügt onDestroy
zu beheben ein neues Problem, das aufgetaucht nach dem fixieren erstes Problem genannt zu werden. )IntentService nicht sendet aber OnReceive erhält keine Sendung
Hier ist, wie ich die Rundfunkdaten zu erfassen versucht, aber onReceive
bekommt nie da Log.w
nie etwas zeigt genannt :
public class MatchesActivity extends Activity implements DatabaseConnector.DatabaseProcessListener
{
public static String SOME_ACTION = "com.dslomer64.servyhelperton.SOME_ACTION";
public static String STRING_EXTRA_NAME = "match";
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LocalBroadcastManager.getInstance(this).registerReceiver
(
new BroadcastReceiver()
{
@Override public void onReceive(Context context, Intent intent)
{
String s = txaMatches.getText().toString() + intent.getStringExtra(STRING_EXTRA_NAME) ;
txaMatches.setText(s);
Log.w("MatchesActivity","`````onReceive <" + s + ">");
}
}, new IntentFilter(SOME_ACTION)
);
...
DatabaseConnector dbc = new DatabaseConnector(getApplicationContext(), assets);
dbc.setDbProcesslistener(this); // set way to know matches has been defined
dbc.findDBMatches();
} // end onCreate
} // end MatchesActivity
Datenbank-Anschluss:
public DatabaseConnector(Context _context, AssetManager _assets)
{
mContext = _context;
//This method, called in `MatchesActivity` on button press, does start the service:
public void findDBMatches()
{
Intent i= new Intent(mContext, QueryDB.class);
mContext.startService(i);
}
// Here's the service:
public static class QueryDB extends IntentService
{
public QueryDB() { super(QueryDB.class.getSimpleName()); }
public QueryDB(String name) { super(name); }
//Here's the procedure that does all the work (and it does execute):
@Override protected void onHandleIntent(Intent intent)
{ ...
publishProgress(dicWord); // a String
}
//This does execute but it doesn't send `progress` back to `MatchesActivity`,
//which initiated request for service (note: `publishProgress` is so named
//because `QueryDB` used to be an `AsyncTask` and I just didn't change the name):
protected void publishProgress(String progress)
{
Intent intent = new Intent(MatchesActivity.SOME_ACTION);
intent.putExtra(MatchesActivity.STRING_EXTRA_NAME, progress);
this.sendBroadcast(intent); // THIS LINE IS THE PROBLEM, FIXED BELOW
Log.w("DatabaseConnector", "`````publishProgress <" + progress + ">");
}
}
Welche Verbindung (en) habe ich versäumt zu machen?
EDIT
Dies ist die KORRIGIERT Methode nur oben gefunden:
protected void publishProgress(String progress)
{
Intent intent = new Intent(MatchesActivity.SOME_ACTION);
intent.putExtra(MatchesActivity.STRING_EXTRA_NAME, progress);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
Hier ist onDestroy
in MatchesActivity
(die den Dienst gestartet wird), notwendig zu rufen, wenn Dienst seine Arbeit beendet hat:
@Override protected void onDestroy()
{
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
Beachten Sie, dass sich onDestroy
auf eine neuebeziehtVariable, definiert als:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
{
@Override public void onReceive(Context context, Intent intent)
{
String s = intent.getStringExtra(STRING_EXTRA_NAME) ;
txaMatches.append(s + "\n");
}
};
Und onCreate
in MatchesActivity
bekam einfacher, weil die Definition mMessageReceiver
:
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LocalBroadcastManager.getInstance(this).registerReceiver
(
mMessageReceiver, new IntentFilter(SOME_ACTION)
);
}
@ CommonsWare - Recht auf das Geld. Ich war so nah und das ist so offensichtlich. Ah, gut. Vielen Dank. Nochmal. – DSlomer64
Wow. Das ist toll. App macht genau das, was ich will (soweit). und es war SO EINFACH, von 'AsyncTask' zu' IntentService' zu wechseln. Es scheint, keine Unterbrechung kann es aufhalten. Wir werden sehen. Ich werde einen Kommentar hinzufügen, wenn etwas Unvorhergesehenes auftritt. – DSlomer64
Eine sehr wichtige Aufgabe, der ich mich nicht widmete, ist "unregisterReceiver". Folglich enthielten nachfolgende Läufe doppelte Ausgabezeilen - alles korrekt, nur so oft angezeigt, wie ich "den Knopf gedrückt" hatte, um eine neue Suche durchzuführen. Um dies zu tun, musste ich eine Variable 'mReceiver' erstellen und die Registrierung in' onDestroy' aufheben. – DSlomer64