如何在不单击按钮的情况下运行 onCreate() 中的方法

Posted

技术标签:

【中文标题】如何在不单击按钮的情况下运行 onCreate() 中的方法【英文标题】:How to run methods in onCreate() without button click 【发布时间】:2021-09-01 18:37:21 【问题描述】:

现在,当我的应用启动时,我必须单击该按钮两次才能显示数据。我想要 打开显示数据的应用程序。不使用 onclick 方法,来自 volley api 请求的数据不会加载。我正在使用 recyclerviw 将数据绑定到视图。我什至尝试创建一个单独的类来获取数据,但只适用于按钮点击。

    private ArrayList<Stocks_data_model> exampleList;
    private RequestQueue mQueue;
    static String t;
    static String n;
    static String p;
    static String c;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mQueue = MySingleton.getInstance(this).getRequestQueue();
        exampleList = new ArrayList<>();


        findViewById(R.id._button).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                try 
                     my_func(exampleList);

                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );

        //real data
    


    public  void my_func(ArrayList mAr)
//         exampleList = new ArrayList<>();

        String _url = "";
        // TODO: Handle error
        //                    Toast.makeText(getApplicationContext(), "[NETWORK ERROR]\nCheck Data Connection...", Toast.LENGTH_SHORT).show();
        JsonObjectRequest req_Gainers2 = new JsonObjectRequest
                (Request.Method.GET, _url, null, response -> 
                    try 
                        Log.d("tag", "working");

                        for(int i=0; i<5; i++)
                        JSONArray gainers = response.getJSONArray("mostGainerStock");
                        JSONObject myData = gainers.getJSONObject(i);
                        String _name = myData.getString("companyName");
                        String _ticker = myData.getString("ticker");
                        String _price = myData.getString("price");
                        double _changes = myData.getDouble("changes");
                        String _change_percent = myData.getString("changesPercentage");

                        mAr.add(new Stocks_data_model(_ticker, _name, _price, _change_percent));
//                         exampleList.add(new Stocks_data_model(_ticker, "name", "$10.99", _change_percent));

                            t = _ticker;
                            n=_name;
                            p=_price;
                            c=_change_percent;


                        
                     catch (JSONException e) 
                        e.printStackTrace();
                    

                , Throwable::printStackTrace);
//         mQueue.add(req_Gainers2);
        mQueue.add(req_Gainers2);

        buildRecyclerView();

    

经过一些反馈,这是我尝试的新 onCreate 方法,但仍然出现同样的问题。

protected void onCreate(Bundle savedInstanceState) 
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mQueue = MySingleton.getInstance(this).getRequestQueue();
         exampleList = new ArrayList<>();


         findViewById(R.id._button).setOnClickListener(new View.OnClickListener() 
             @Override
             public void onClick(View v) 
                 try 
                      my_func(exampleList);
                      buildRecyclerView();

                  catch (Exception e) 
                     e.printStackTrace();
                 
             
         );

【问题讨论】:

我猜这是因为 buildRecyclerView 在网络请求有机会完成之前被调用,而您可能是想在之后调用它? 基本上@HenryTwist 所说的是正确的,您正在使用 volley 进行异步调用,您应该在响应内部而不是外部构建/通知您的 recycleView 更改数据 【参考方案1】:

您提到您希望在不单击按钮的情况下加载数据,并且您将负责检索和显示数据的所有代码放在按钮的 OnClickListener 中。 如果您想在应用加载时显示数据,请从 OnClickListener 中取出所有代码。

在双击之前您看不到数据是因为,一旦您单击,数据检索就会异步开始,代码会继续运行并到达设置 recyclerview。但数据尚未检索。这就是 recyclerview 不显示任何内容的原因。

在您随后单击该按钮时,数据检索完成,recyclerview 可以显示数据。

要修复它,我们需要等到数据被检索到。这可以通过多种方式实现。 快速修复可以在 my_func() 内的 try 块的最后一行调用您的 buildRecyclerView() 函数。

【讨论】:

我在尝试中调用了buildRecyclerView(),在我的功能下,但仍需要单击2 次才能显示。我将代码保存在 onclick 方法中,因为否则,正如您提到的那样,空的 recyclerview 不会发生任何事情,onclick 可以帮助我检索数据。由于 api 调用本身是异步的,使用 try/catch,我真的不需要在 oncreate 中使用另一个 tyr/catch,但使用它希望它会有所帮助。请进一步建议我如何解决此问题。我可以发布新代码 很抱歉,我无法提及您应该从哪个 try 块调用 buildRecyclerView()。从 my_func() 内的 try 块的最后一行调用该函数 yooo 兄弟,你真是个他妈的英雄。已经研究了一个多月,只是决定问我自己的问题,因为没有一个工作,现在,一个小时后,我得到了答案。我真的很感谢你,谢谢。 很高兴知道它有效。如果它解决了您的问题,您可以将我的答案标记为已接受的答案。编码快乐!!!【参考方案2】:

要在不点击的情况下获取数据,请在点击侦听器之外调用方法。

    my_func(exampleList);

在 my_fun() 方法之前运行你的 buildRecyclerView(); oncreate 中的方法。

然后在try块的最后一行通知recyclerView的适配器更新其中的数据。

【讨论】:

【参考方案3】:

只需在onCreate 中调用您的方法。例如:

protected void onCreate(Bundle savedInstanceState) 
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     mQueue = MySingleton.getInstance(this).getRequestQueue();
     exampleList = new ArrayList<>();
     
     thisIsMyFunction();
     


public void thisIsMyFunction() 
     try 
          my_func(exampleList);
          buildRecyclerView();

      catch (Exception e) 
          e.printStackTrace();
     
     //you can add all the code you want to execute here

【讨论】:

以上是关于如何在不单击按钮的情况下运行 onCreate() 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在不单击“下一步”按钮的情况下以重力形式进入下一页

如何在不单击后退按钮的情况下隐藏键盘[重复]

当我单击编辑按钮时,如何在不向上滚动的情况下保持编辑行?

如何在不向它们提供 ID 的情况下更改按钮单击时 textview 的可见性?

如何在不单击任何按钮的情况下将复选框值放入会话变量中?

如何在不更改颜色的情况下禁用 Vuetify 按钮