Java 从MainActivity通知onPostExecute的片段
在Android中,我很难弄清楚当异步任务完成时,如何通知正在侦听的片段。通常的Java东西,比如说Java 从MainActivity通知onPostExecute的片段,java,android,listener,Java,Android,Listener,在Android中,我很难弄清楚当异步任务完成时,如何通知正在侦听的片段。通常的Java东西,比如说PropertyChangeLIstener,似乎不可用。所以在onPostExecute中,我想触发一个事件并让OtherFragment看到它 我该怎么做 public class MainActivity extends FragmentActivity { <stuff> private class ConsumeWebService
PropertyChangeLIstener
,似乎不可用。所以在onPostExecute
中,我想触发一个事件并让OtherFragment
看到它
我该怎么做
public class MainActivity extends FragmentActivity {
<stuff>
private class ConsumeWebService extends AsyncTask
<String, // type of the parameters sent to the task upon execution - doInBackground()
Integer, // type of the progress units published during the background computation -onProgressUpdate()
String> {
public ConsumeWebService(SomeKindOfListener listener){
this.myListener = listener;
}
protected String doInBackground(String... urls) {
< get JSON data from RESTful service>
< create and populate SQLite db wit JSON data>
return jsonData;
}
@Override
protected void onPostExecute(String result) {
try {
<fire some kind of event>
}
catch (Exception e) {
}
}
}
}
public class OtherFragment extends Fragment implements SomeKindOfListener {
@Override
public void someKindOfChange(SomeKindOfChangeEvent arg0) {
< do the stuff we want to do>
}
}
public interface SomeKindOfListener {
void onPostExecuteDone();
}
public类MainActivity扩展了FragmentActivity{
私有类ConsumerWebService扩展异步任务
{
公共用户Web服务(某种类型的listener-listener){
this.myListener=侦听器;
}
受保护的字符串doInBackground(字符串…URL){
<从RESTful服务获取JSON数据>
<使用JSON数据创建并填充SQLite数据库>
返回jsonData;
}
@凌驾
受保护的void onPostExecute(字符串结果){
试一试{
}
捕获(例外e){
}
}
}
}
公共类OtherFragment扩展片段实现某种类型的Listener{
@凌驾
public void somekindof更改(somekindof更改事件arg0){
<做我们想做的事>
}
}
某种类型的Listener的公共接口{
void onPostExecuteDone();
}
使用碎片管理器:
SomeKindOfListener listener = (SomeKindOfListener )
getFragmentManager().findFragmentById(R.id.myFragment);
new ConsumeWebService(listener);
以及:
我会这样做: 1-有一个接口
public interface OnXListener {
void onX(Object data);
}
2-让片段实现它
public class MyFragment extends Fragment implements OnXListener{
public void onX(Object data) {
doSomething(data);
}
public void doSomething(data) {
/do the real thing
}
}
3-任务完成后,在Activity中调用此函数
public class MyActivity extends Activity {
Fragment mMyFragment fragment;
//stuff, initializate fragment, show fragment, etc.
private class MyAsyncTask extends AsyncTask {
//stuff
@override
protected void onPostExecute(Object result) {
((OnXListener) MyActivity.this.mMyFragment).onX(result);
}
}
}
在片段本身中没有异步任务有什么原因吗?这是一个很好的问题。我也许能把它搬走。尽管如此,我对如何实现这一点很感兴趣。不要这样做,asynctask应该由活动而不是片段来管理。好的,片段不应该这样做有什么原因吗。因为片段是可分离的模块,也许将来你会想做一个平板电脑版本,并显示另一个或多个需要该任务结果的片段,你需要在另一个片段复制代码中添加相同的asynctask,我认为更好的方法是从活动本身管理它,并在片段上实现侦听器接口,任务完成后,在PostExecute上调用该侦听器。如何在
onPostExecute()
中触发事件?如果我理解正确,这并不是真正实现事件侦听器的通知,而是直接调用片段中的方法。这就是实现侦听器的方式,你也可以检查一下,我很感激你的意见,我并不想争论,但在我看来,这个方法不会被直接调用。例如,对于a,不直接调用propertyChanged
方法。它必须在实现中的某个地方调用该方法,现在没有时间分析该源代码,但您可以查看此答案以了解更多说明。对我来说,这些是使用“伪”侦听器的接口。在J2SE
和PropertyChangeListener
之类的类中,功能包含在Java中,因此不直接调用所需的方法。这样的侦听器在J2ME
中似乎不可用,因此必须按照您链接到的示例执行。
public class MyActivity extends Activity {
Fragment mMyFragment fragment;
//stuff, initializate fragment, show fragment, etc.
private class MyAsyncTask extends AsyncTask {
//stuff
@override
protected void onPostExecute(Object result) {
((OnXListener) MyActivity.this.mMyFragment).onX(result);
}
}
}