作者givemepass (〆)
看板AndroidDev
标题Re: [问题] arraylist内容
时间Thu Sep 10 11:05:14 2015
※ 引述《d93n8311 (d93n8311)》之铭言:
: http://pastebin.com/aATXzZFZ
: 这是我的程式码,底下是Log内容
: 我想请问一下为何我在try catch中可以抓到我需要的东西并add进我的ArrayList内
: Log中也能看见name.add()确实有执行。
: 在listener中的name.isempty()也确实不为空(我有把内容印出来过确定也没问题)
: 但是在底下那行txt.setView(name.isempty())就会印出true
: (我也印过name.toString确实为空)
: 有办法能让name在listener外也不为空吗?
这边被你程式码骗了XD, 我一开始先看程式码,
想说拉到全域变数的list为什麽会不一致呢?
後来看内文才知道你的错误是写成区域变数导致的。
推文切出两个重点:
1F:→ passli: 就是执行的顺序问题 你先txt.setText 然後才送request 09/09 13:58
2F:→ ssccg: 不是thread的关系,是方法中的匿名类别的关系 09/10 02:13
3F:→ ssccg: inner class会保有enclosing class的object reference 09/10 02:14
4F:→ ssccg: 但method中的变数在method结束就没了,所以实作是会copy一 09/10 02:16
5F:→ ssccg: 份到inner class里,所以原本的宣告要求final,才不会跟 09/10 02:16
6F:→ ssccg: copy过去的不一致 09/10 02:16
7F:→ ssccg: 不在method中的class field就没这限制 09/10 02:17
1. 执行顺序的问题
当宣告一个一个匿名类别
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//step 1
new Thread(new Runnable() {
@Override
public void run() {
//step 3
}
}).start();
//step 2
}
顺序将会是这样, 所以当你使用的时候要特别注意。
2. 匿名类别使用外部变数的问题
如同推文所说的,
区域变数并不是为了给匿名类别使用,
所以会复制一份变数给匿名类别使用,
因此会要求你宣告为final,
确保复制区域变数时的一致性。
如果你想要拿到执行绪完的结果, 来进行资料的一致,
解法的确是你所写的, 拉至全域变数,
但是这边要注意的是, 你必须确保执行绪执行完且没有跳例外後,
才会拿到正确的资料。
所以你再volley接完资料後, 就必须确保response是成功的再去拿json。
所以结论应该是这样
private ArrayList<String> list;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
list = new ArrayList<String>();
RequestQueue mQueue = Volley.newRequestQueue(this);
JsonArrayRequest req = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
//处理你的response
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//处理错误
}
});
mQueue.add(req);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.25.228
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1441854318.A.40F.html
8F:推 d93n8311: 感谢各位的帮助 09/10 18:21
9F:→ d93n8311: 我用handlerMessage有达成我要的效果了 09/10 18:22