Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从MainActivity通知onPostExecute的片段_Java_Android_Listener - Fatal编程技术网

Java 从MainActivity通知onPostExecute的片段

Java 从MainActivity通知onPostExecute的片段,java,android,listener,Java,Android,Listener,在Android中,我很难弄清楚当异步任务完成时,如何通知正在侦听的片段。通常的Java东西,比如说PropertyChangeLIstener,似乎不可用。所以在onPostExecute中,我想触发一个事件并让OtherFragment看到它 我该怎么做 public class MainActivity extends FragmentActivity { <stuff> private class ConsumeWebService

在Android中,我很难弄清楚当异步任务完成时,如何通知正在侦听的片段。通常的Java东西,比如说
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);
        }
    }
}