这是我的 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_name 和 user.size ,这意味着用户不为空,但是每当我尝试调用 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
我的错误在哪里?
答案 0 :(得分:1)
如果您确定getAllFriends()
中的线程肯定在线程successRunnableFriends
之前运行,那么您可能会遇到
ArrayList<User> users;
这应该是
volatile ArrayList<User> users;
因为否则允许JVM兑现新启动的线程的值。
检查这个好article。
p.s。 :如果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
。您需要确保的是users
中getAllFriends()
的分配是在您在另一个线程中访问它之前完成的。使用wait
和notify
来实现此目的。检查实例this article的基础知识。