如何在不单击按钮的情况下运行 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() 中的方法的主要内容,如果未能解决你的问题,请参考以下文章