用volley的JOSNObjectRequest获取网络joso数据

reid3290 发布于 2014/10/19 22:49
阅读 2K+
收藏 0
正在学习volley框架,在用JOSNObjectRequest遇到一个小问题。如果我的代码如下(注意setText()调用是发生在listener里面的):
public class MainActivity extends Activity {

String strs;//这个字符串用于赋值给TextView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main );


strs = "FUCK YOU";// 字符串初始化
// 下面调用Volley的JsonObjectRequest访问服务器
RequestQueue mQueue = Volley.newRequestQueue(this);
                // 下面定义listener
Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
            @Override  
            public void onResponse(JSONObject response){
   try {
   strs = response.getString("obj")//这里改变了strs的值
                            TextView myTextView = ( TextView )findViewById( R.id.myTextView );
           myTextView.setText( strs );//这里(在listener里面)调用了setText()函数
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://115.29.11.46/demo27/php/randPic.php", null,  
       listener
       , new Response.ErrorListener() {  
           public void onErrorResponse(VolleyError error) {  }  });  
mQueue.add(jsonObjectRequest);
}
那么屏幕显示的将是由服务器返回后经调用getString()得到的一个字符串,而不是strs的初始值“FUCK YOU”,但是如果将setTextView()的调用放在listener之外,即如下所示:


public class MainActivity extends Activity {

String strs;//这个字符串用于赋值给TextView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main );


strs = "FUCK YOU";// 字符串初始化
// 下面调用Volley的JsonObjectRequest访问服务器
RequestQueue mQueue = Volley.newRequestQueue(this);
                // 下面定义listener
Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
            @Override  
            public void onResponse(JSONObject response){
   try {
   strs = response.getString("obj");//这里改变了strs的值
                         // 注意这里不再调用setTextView()
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://115.29.11.46/demo27/php/randPic.php", null,  
       listener
       , new Response.ErrorListener() {  
           public void onErrorResponse(VolleyError error) {  }  });  
mQueue.add(jsonObjectRequest);
TextView myTextView = ( TextView )findViewById( R.id.myTextView );
           myTextView.setText( strs );//注意:这里(在listener之外)调用了setText()函数}
那屏幕显示的将是strs的初始值,而不是从服务器得到的值,也就是说listener中的
strs = response.getString("obj")
没有起作用,这是为什么,请大神解疑释惑!!!
加载中
0
kylin
kylin
那是一个回调函数,放在外面,settext会比listener先执行,所以没用
reid3290
reid3290
@reid3290 我在linstener里面加入 MyAdapter adapter = new Myadapter( this,strs );listview.setAdapter(adapter);报空指针错误,请问是为什么?
reid3290
reid3290
能详细讲一下整个程序的执行过程吗?
返回顶部
顶部