このデモに基づいて、完全に機能するFragmentActivityを作成しました。
もともと (私のアプリの他のアクティビティと同様)、データはUI スレッドの SQLite からFragmentActivity.ListFragment.ListViewにロードされていました。
他の 2 つのアクティビティ (フラグメントまたはリスト アクティビティではない) を、IntentService を使用して SQLite からデータを取得する ResultReceiver パラダイムに変換することに成功しました。このインスタンスの明らかな違いは、カスタムResultReceiverがFragmentActivityではなくListFragmentで宣言されているという事実です。
public EWTRReceiver ArrayListFragmentReceiver;
問題: IntentServiceはリクエストを取得し、データをプルしますが、データを ListFragment に戻すことができません: IntentService.rspPlayers () の次の行で NullPointerException:
r.send(mSignal, resultData);
私は、私がばかのように感じさせる単純なものが欠けていると確信しています...私はただ正しい方向に押される必要があります.
以下は、(1) ListFragment からIntenServiceへの呼び出し、(2) IntentService のonHandleIntent、および (3) ListFragmentにコールバックするIntentServiceのメソッド(rspPlayers()) です。
ありがとう!
FragmentActivity.ListFragment.callCtlr():
private void callCtlr(int mSignal){
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_FRGACTPLAYERS, "ArrayListFragment.callCtlr() called with signal: "+mSignal);
}
/** Intent to transmit between processes */
Intent intent = new Intent(getActivity(), CtlPlayers.class);
// declare Source of Signal
intent.putExtra("Source", ArrayListFragmentReceiver);
/** process signal to send to CtlPlayers */
switch (mSignal){
case Constants.S_DB_READPLYRLDR:
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_FRGACTPLAYERS, "ArrayListFragment.callCtlr(S_DB_READPLYRLDR) to CtlPlayers.");
}
// Send CtlAlliances the request for the list of Alliances in current Sector
intent.putExtra("CurrentSector", this.getArguments().getString("FSECTR"));
intent.putExtra("CurrentAlliance", this.getArguments().getString("FANAME"));
intent.putExtra("signal", Constants.S_DB_READPLYRLDR);
break;
case Constants.S_DB_READPLYRREC:
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_FRGACTPLAYERS, "ArrayListFragment.callCtlr(S_DB_READPLYRREC) to CtlPlayers.");
}
// Send CtlAlliances the request for the list of Alliances in current Sector
intent.putExtra("CurrentSector", this.getArguments().getString("FSECTR"));
intent.putExtra("CurrentAlliance", this.getArguments().getString("FANAME"));
intent.putExtra("signal", Constants.S_DB_READPLYRREC);
break;
default:
//do nothing
break;
}
getActivity().startService(intent);
}
IntentService.onHandleIntent():
protected void onHandleIntent(Intent intentREQ) {
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(Intent intent) called.");
}
/** get the receiver and bundle from the incoming Intent */
ResultReceiver rInComing = intentREQ.getParcelableExtra("Source");
/** get the bundle from the incoming Intent */
extras = intentREQ.getExtras();
/** variable to convey results to ActDlgAddPlyr */
boolean mAnswer = false;
/** tracks ActSector's context */
Context mCtx = getApplicationContext();
int mSignal = intentREQ.getIntExtra("signal", Constants.R_NO_SIGNAL);
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "Signal Received = " + mSignal);
}
switch (mSignal) {
case Constants.R_NO_SIGNAL :
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): NO READABLE SIGNAL WAS RECEIVED!");
}
break;
case Constants.S_DB_ADDPLYR :
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_ADDPLYR received.");
}
synchronized (this) {
// Get the New Sector Name from the bundle
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_ADDPLYR received with New Player.");
}
mAnswer = addNewPlayer(mCtx, extras);
rspPlayers(Constants.R_DB_ADDPLYR, mAnswer, rInComing);
}
break;
case Constants.S_DB_READPLYRLDR :
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_READPLYRLDR received.");
}
synchronized (this) {
// Get the New Sector Name from the bundle
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_READPLYRLDR received.");
}
mAnswer = readPlyrLdr(mCtx, extras);
rspPlayers(Constants.R_DB_READPLYRLDR, mAnswer, rInComing);
}
break;
case Constants.S_DB_READPLYRREC :
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_READPLYRREC received.");
}
synchronized (this) {
// Get the New Sector Name from the bundle
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "onHandleIntent(): S_DB_READPLYRREC received.");
}
mAnswer = readPlyrRec(mCtx, extras);
rspPlayers(Constants.R_DB_READPLYRREC, mAnswer, rInComing);
}
break;
} // end switch
}
IntentService.rspPlayers() [結果を FragmentActivity.ListFragment に送り返す]:
private void rspPlayers(int mSignal, boolean mCode, ResultReceiver r) {
if (BuildConfig.DEBUG) {
Log.i(Constants.TAG_CTLPLAYERS, "respPlayers() called with signal, code: "+mSignal+", "+mCode);
}
Bundle resultData = new Bundle();
switch (mSignal) {
case Constants.R_DB_ADDPLYR :
if (mCode == true) {
resultData.putInt("reqStatus", Constants.R_TRUE_THAT);
} else {
resultData.putInt("reqStatus", Constants.R_NO_WAY);
}
break;
case Constants.R_DB_READPLYRLDR :
if (mCode == true) {
resultData.putInt("reqStatus", Constants.R_TRUE_THAT);
resultData.putInt("NumLdrRows", NumLdrRows);
resultData.putSerializable("LPlyrList", LPlyrArray);
} else {
resultData.putInt("reqStatus", Constants.R_NO_WAY);
}
break;
case Constants.R_DB_READPLYRREC :
if (mCode == true) {
resultData.putInt("reqStatus", Constants.R_TRUE_THAT);
resultData.putInt("NumRecRows", NumRecRows);
resultData.putSerializable("RPlyrList", RPlyrArray);
} else {
resultData.putInt("reqStatus", Constants.R_NO_WAY);
}
break;
default :
// do nothing
break;
}
try {
r.send(mSignal, resultData);
} catch (java.lang.Exception e) {
Log.e(Constants.TAG_CTLPLAYERS, "rspPlayers(): Exception message: "+e.getMessage());
Log.e(Constants.TAG_CTLPLAYERS, "rspPlayers(): Exception cause: "+e.getCause());
e.printStackTrace();
}
}