gpt4 book ai didi

java - 线程()中的错误

转载 作者:行者123 更新时间:2023-12-01 11:42:29 26 4
gpt4 key购买 nike

这是我的 getAllFriends 方法和 Thread

   ArrayList<User> users;
private void getAllFriends()
{
new Thread(){
@Override
public void run(){
try {
api=new Api(Account.access_token, Constants.API_ID);
users = api.getFriends(Account.user_id,"name",null,null,null);
user_name = users.get(0).first_name;
api = null;

runOnUiThread(successRunnableFriends);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
Runnable successRunnableFriends = new Runnable(){
@Override
public void run() {
user_name = users.get(0).first_name;
Toast.makeText(c, String.valueOf(users.size()), Toast.LENGTH_LONG).show(); // Shows 166
}
};

它给了我特定的user_nameuser.size,这意味着users不为空,但是每当我尝试调用getAllFriends时,它都会提示null

    public void getFriends(Context _c) {
c = _c;
getAllFriends();
if(users.size() == 0)
Toast.makeText(c,String.valueOf(user_name), Toast.LENGTH_LONG).show();//null

我的错误在哪里?

最佳答案

如果您确定 getAllFriends() 中的线程肯定在线程 successRunnableFriends 之前运行,那么您的声明可能存在问题

ArrayList<User> users;

这应该是

volatile ArrayList<User> users;

因为否则 JVM 可以兑现新启动线程的值。

例如,检查这个不错的 article .

附注:如果 volatile 不起作用,请考虑以下事项。此时此刻

if(users.size() == 0)
Toast.makeText(c,String.valueOf(user_name), Toast.LENGTH_LONG).show();

执行api.getFriends(Account.user_id,"name",null,null,null);很可能尚未完成。因此 Toast 显示 null。您必须确保在 getAllFriends() 中对 users 的分配已完成,然后才能在另一个线程中访问它。使用 waitnotify 来实现这一点。检查例如this article了解基础知识。

关于java - 线程()中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com