在我的Android应用程序中,我有一个带有适配器的简单列表视图。有一个繁重的查询,即用数据填充列表视图。所以我把它放到一个运行在另一个线程中的IntentService中。
IntentService通常单独运行,只需查询一些数据并将其插入SQLite数据库。
但现在我希望有以下可能性:
这个是可能的吗?我在这里读到了很多关于堆栈溢出的问题。但在每一个问题上,都有另一个解决办法。所以我想问大家:哪种解决方案最适合我的目的?
发布于 2012-02-01 00:23:46
例如,我使用ResultReceiver在我的Activity (扩展ListActivity)的适配器上调用notifyDataSetChanged()。它可以用来做你需要做的任何事情。
ResultReceiver代码:
public class MyResultReceiver extends ResultReceiver {
private Context context = null;
protected void setParentContext (Context context) {
this.context = context;
}
public MyResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult (int resultCode, Bundle resultData) {
// Code to process resultData here
((BaseAdapter) ((ListActivity)context).getListAdapter()).notifyDataSetChanged();
}
}MyActivity代码:
public class MyActivity extends ListActivity {
private MyResultReceiver theReceiver = null;
...
private void callService () {
theReceiver = new MyResultReceiver(new Handler());
theReceiver.setParentContext(this);
Intent i = new Intent("com.mycompany.ACTION_DO_SOMETHING");
// Code to define and initialize myData here
i.putExtra("someData", myData);
i.putExtra("resReceiver", theReceiver);
startService(i);
}
}IntentService代码:
Bundle resultBundle = new Bundle();
ResultReceiver resRec = intent.getParcelableExtra("resReceiver");
// Do some work then put some stuff in resultBundle here
resRec.send(12345, resultBundle);发布于 2013-10-06 05:30:34
当IntentService完成时,它应该使用LocalBroadcastManager向任何注册的活动发送意图。
IntentService将包含如下代码:
private void sendBroadcast() {
Intent intent = new Intent("myBroadcastIntent");
intent.putExtra("someName", someValue);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}接收通知的活动将包含如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String someValue = intent.getStringExtra("someName");
// ... do something ...
}
};
LocalBroadcastManager.getInstance(this)
.registerReceiver(receiver, new IntentFilter("myBroadcastIntent"));
}有关更深入的内容,请参见博客文章在服务中使用LocalBroadcastManager进行活动通信。
发布于 2014-03-20 14:53:06
其他答案都没有提到官方的android文档。
https://developer.android.com/training/run-background-service/report-status.html
这清楚地表明,对于活动-IntentService通信,“推荐的发送和接收状态的方法是使用LocalBroadcastManager,它将广播意图对象限制在您自己的应用程序中的组件”!
https://stackoverflow.com/questions/9088315
复制相似问题