我正在使用 IntentService 通过 JSON 处理与服务器的网络通信。 JSON/服务器部分工作正常,但我无法将结果返回到需要的地方。以下代码显示了我如何从 onClick() 内部启动意图服务,然后让该服务更新全局变量以将结果转发回主活动。
public class GXActivity extends Activity {
private static final String TAG = "GXActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
// === called when the activity is first created
Log.i(TAG, "GXActivity Created");
super.onCreate(savedInstanceState);
setContentView(R.layout.start);
View.OnClickListener handler = new View.OnClickListener() {
public void onClick(View v) {
// === set up an application context to hold a global variable
// === called user, to contain results from the intent service
GXApp appState = ((GXApp) getApplicationContext());
User user = new User(-1); // initialize user id to -1
appState.setUser(user);
// === next start an intent service to get JSON from the server;
// === this service updates the user global variable with
// === results from the JSON transaction
Intent intent = new Intent(this, GXIntentService.class);
startService(intent);
// === check app context for results from intent service
appState = ((GXApp) getApplicationContext());
if (appState.getUser().getId() != -1)...
}
}
}
}
我遇到的问题是,解析 JSON 的意图服务直到 onCreate() 完成后才会被调用,因此我查找结果的代码一直在查看未初始化的结果。
我应该采取什么不同的做法,以便在检查结果之前调用意图服务?如果我将点击侦听器从 onCreate() 函数中拉出,它会起作用吗?是否有另一个/更好的结构来构造此代码?非常感谢。
你应该考虑创建自己的ResultReceiver http://developer.android.com/reference/android/os/ResultReceiver.html您的活动的子类。ResultReceiver
实施Parcelable
所以可以从你的Activity
给你的Service
作为额外的Intent
.
你需要做这样的事情:
实现一个子类ResultReceiver
在您的活动课程中。实现的关键方法是onReceiveResult()
。该方法为您提供了Bundle
结果数据,可用于传递您在检索中检索的任何信息Service
。只需解压缩您需要的数据并使用它来更新您的活动。
在您的活动中,创建自定义的新实例ResultReceiver
并将其添加到Intent
你用来启动你的服务。
In your Service
's onStartCommand()
方法,检索ResultReceiver
传递于Intent
并将其存储在本地成员变量中。
一旦你的Service
完成它的工作,让它调用send()
在 ResultReceiver 上传递您想要发送回活动的任何数据Bundle
.
这是一种非常有效的模式,意味着您不会将数据存储在令人讨厌的静态变量中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)