Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 从片段类调用Web服务(API)的正确方法_Java_Android_Web Services_Android Fragments_Android Fragmentactivity - Fatal编程技术网

Java 从片段类调用Web服务(API)的正确方法

Java 从片段类调用Web服务(API)的正确方法,java,android,web-services,android-fragments,android-fragmentactivity,Java,Android,Web Services,Android Fragments,Android Fragmentactivity,我需要知道,在哪一个片段回调方法中,我们应该调用一个web服务,在返回到片段后web服务不应该再次调用 比如说。 我有一个片段类MyFragment.java public class MyFragment extends Fragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override publi

我需要知道,在哪一个片段回调方法中,我们应该调用一个web服务,在返回到片段后web服务不应该再次调用

比如说。 我有一个片段类MyFragment.java

public class MyFragment extends Fragment {


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_layout, container,
                false);

        return rootView;
    }

}

我需要知道我必须调用哪个回调方法来更新fragment的UI现在我正在从
onCreateView
方法调用web服务。但我需要知道从片段调用web服务的最佳方式。

如果我正确理解了您的问题,您希望从服务器获取一些数据,然后通知片段数据已准备好并重新绘制片段,对吗?根据文件:

onCreate()- 系统在创建片段时调用此函数。在您的实现中,您应该初始化片段的基本组件,当片段暂停或停止时,您希望保留这些组件,然后继续

onCreateView() 当片段第一次绘制其用户界面时,系统调用此函数。要为片段绘制UI,必须从该方法返回一个视图,该视图是片段布局的根。如果片段不提供UI,则可以返回null

当您在应用程序中的其他地方创建片段时,将调用
onCreate()
方法。当必须第一次绘制片段时,将调用onCreateView(),该方法返回一个已创建的视图。在您的情况下,您可能会选择以下内容:

  • 为此数据和适配器声明实例变量(容器)(如果使用)
  • onCreate
    中,初始化所有数据(空容器),初始化适配器,然后执行
    AsyncTask
  • onCreateView
    中,准备视图以返回-适配器等。因此,一旦
    AsyncTask
    完成,它将在
    onPostExecute
    中调用
    您的适配器。notifyDataSetChanged()
    。这将重新绘制片段,因为适配器将被告知数据已更改(从服务器获取)

  • 取决于您希望何时获取数据。 每次应用程序出现在前台时,您都想要它吗? 使用onResume() 您是否只想在应用程序首次启动时使用它? 使用onViewCreated(),它在onCreateView完成后被调用。

    onCreate()很棘手。 在onCreate()方法中只调用一次要调用的所有内容。 例如,API调用、列表、适配器初始化

    所以理想情况下我会这样做

    currentFragment = FirstFragment.getInstance();
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    currentFragment = getSupportFragmentManager().findFragmentByTag("FIRST_KEY");
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    棘手的部分 但是如果您确实希望
    onCreate()
    被调用一次,那么重用片段。(不要每次都创建新实例)

    如何重用片段? 当第一次添加时,使用如下键将其添加到backbackback

    currentFragment = FirstFragment.getInstance();
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    currentFragment = getSupportFragmentManager().findFragmentByTag("FIRST_KEY");
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    当您想再次添加它时,使用如下键获取旧实例

    currentFragment = FirstFragment.getInstance();
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    currentFragment = getSupportFragmentManager().findFragmentByTag("FIRST_KEY");
    getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentHolder, currentFragment, "FIRST_KEY")
                .addToBackStack("FIRST_KEY")
                .commit();
    
    演示项目: 下面是一个演示项目的链接,该项目使用Volley库加载图像列表。它有一个类似的实现


    使用底部导航,所有片段都将重新创建。在我的例子中,我只需要调用API一次。如何通过您的方法实现这一点?