首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只为最后一个json对象获取值的onPostExecute()

只为最后一个json对象获取值的onPostExecute()
EN

Stack Overflow用户
提问于 2014-10-10 11:45:56
回答 2查看 505关注 0票数 0

我已经成功地实现了parsed JSON,并为两个对象获得了值,比如:AsyncTask中的图像、句点,但在onPostExecute()方法中,我只为last json object获取value

在这里,我只得到期间的最后一个对象值:

代码语言:javascript
复制
 delay, period); // getting last object's period value only

为什么在onPostExecute()方法中只能得到句点对象的最后一个对象值?

MainActivity.java:

代码语言:javascript
复制
public class MainActivity extends Activity {

    ArrayList<String> actorsList;
    ViewFlipper viewFlipper;    
    Handler mHandler ;
    Timer timer;
    Runnable mUpdateResults;
    int delay = 500;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewFlipper = (ViewFlipper) findViewById(R.id.flipper);

        actorsList = new ArrayList<String>();

        // execute AsyncTask
        new JSONAsyncTask().execute("http://localhost/images.txt");

        // handler to set duration and to upate animation
        mHandler = new Handler();

        // Create runnable for posting
        mUpdateResults = new Runnable() {
            public void run() {
                viewFlipper.showNext(); // showNext() method
            }
        };

        timer = new Timer();        
    }

    // AsyncTask to get data from server
    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {
        int period;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Boolean doInBackground(String... urls) {
            try {

                //------------------>>
                HttpGet httppost = new HttpGet(urls[0]);
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response = httpclient.execute(httppost);

                // StatusLine stat = response.getStatusLine();
                int status = response.getStatusLine().getStatusCode();

                if (status == 200) {
                    HttpEntity entity = response.getEntity();
                    String data = EntityUtils.toString(entity);

                    JSONObject jsono = new JSONObject(data);
                    JSONArray jarray = jsono.getJSONArray("images");

                    for (int i = 0; i < jarray.length(); i++) {
                        JSONObject object = jarray.getJSONObject(i);

                        actorsList.add(object.getString("image"));
                        Log.d("image: ", object.getString("image"));                        
                        try {
                            period = Integer.parseInt(object.getString("period").toString());
                            Log.d("period: ", object.getString("period"));
                        } catch (NumberFormatException nfe) {
                            // TODO: handle exception
                            System.out.print("could not parse:" + nfe);
                        }                       
                    }
                    return true;
                }

            } catch (ParseException e1) {
                e1.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return false;
        }

    protected void onPostExecute(Boolean result) {
        if(result == false)
        {
            Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
        }
        else
        {           
            for(int i=0; i<actorsList.size(); i++)
            {
                ImageView image = new ImageView(getApplicationContext());              

                Picasso.with(MainActivity.this)
                .load(actorsList.get(i).toString())
                .placeholder(R.drawable.ic_launcher)
                .error(R.drawable.ic_launcher)
                .into(image);

                viewFlipper.addView(image); // addView(..) method
            }           

             Log.d("period:post- ", String.valueOf(period));
             timer.scheduleAtFixedRate(new TimerTask() {

                public void run() {
                    mHandler.post(mUpdateResults);
                }
            }, delay, period); // getting last object's period value only

          }
       }
    }
}

Logcat:

代码语言:javascript
复制
10-10 11:46:52.527: D/image:(542): http://localhost/image_01.jpg
10-10 11:46:52.536: D/period:(542): 50000
10-10 11:46:52.536: D/image:(542): http://localhost/image_05.jpg
10-10 11:46:52.536: D/period:(542): 5000
10-10 11:46:52.536: D/image:(542): http://localhost/image_06.jpg
10-10 11:46:52.536: D/period:(542): 5000
10-10 11:46:52.546: D/image:(542): http://localhost/image_07.jpg
10-10 11:46:52.546: D/period:(542): 25000
10-10 11:46:52.546: D/image:(542): http://localhost/image_08.jpg
10-10 11:46:52.546: D/period:(542): 5000
10-10 11:46:52.546: D/image:(542): http://localhost/image_02.jpg
10-10 11:46:52.556: D/period:(542): 5000
10-10 11:46:52.556: D/image:(542): http://localhost/image_03.jpg
10-10 11:46:52.556: D/period:(542): 1000
10-10 11:46:52.556: D/image:(542): http://localhost/image_04.jpg
10-10 11:46:52.566: D/period:(542): 1000
10-10 11:46:52.616: D/period:post-(542): 1000
EN

回答 2

Stack Overflow用户

发布于 2014-10-10 11:57:27

因为在这个循环中:

代码语言:javascript
复制
       for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    actorsList.add(object.getString("image"));
                    Log.d("image: ", object.getString("image"));                        
                    try {
                        period = Integer.parseInt(object.getString("period").toString());
                        Log.d("period: ", object.getString("period"));
                    } catch (NumberFormatException nfe) {
                        // TODO: handle exception
                        System.out.print("could not parse:" + nfe);
                    }                       
                }

当它结束时,您的period等于您解析的最后一个json

代码语言:javascript
复制
public class MainActivity extends Activity {

    ArrayList<String> actorsList;
    ViewFlipper viewFlipper;    
    Handler mHandler ;
    Timer timer;
    List<Integer> periodsList;
    Runnable mUpdateResults;
    int delay = 500;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        periodsList=new ArrayList<Integer>();

        viewFlipper = (ViewFlipper) findViewById(R.id.flipper);

        actorsList = new ArrayList<String>();

        // execute AsyncTask
        new JSONAsyncTask().execute("http://localhost/images.txt");

        // handler to set duration and to upate animation
        mHandler = new Handler();

        // Create runnable for posting
        mUpdateResults = new Runnable() {
            public void run() {
                viewFlipper.showNext(); // showNext() method
            }
        };

        timer = new Timer();        
    }

    // AsyncTask to get data from server
    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {
        int period;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Boolean doInBackground(String... urls) {
            try {

                //------------------>>
                HttpGet httppost = new HttpGet(urls[0]);
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response = httpclient.execute(httppost);

                // StatusLine stat = response.getStatusLine();
                int status = response.getStatusLine().getStatusCode();

                if (status == 200) {
                    HttpEntity entity = response.getEntity();
                    String data = EntityUtils.toString(entity);

                    JSONObject jsono = new JSONObject(data);
                    JSONArray jarray = jsono.getJSONArray("images");

                    for (int i = 0; i < jarray.length(); i++) {
                        JSONObject object = jarray.getJSONObject(i);

                        actorsList.add(object.getString("image"));
                        Log.d("image: ", object.getString("image"));                        
                        try {

                            period = Integer.parseInt(object.getString("period").toString());
                            periodsList.add(Integer.parseInt(object.getString("period").toString()));
                            Log.d("period: ", object.getString("period"));
                        } catch (NumberFormatException nfe) {
                            // TODO: handle exception
                            System.out.print("could not parse:" + nfe);
                        }                       
                    }
                    return true;
                }

            } catch (ParseException e1) {
                e1.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return false;
        }

    protected void onPostExecute(Boolean result) {
        if(result == false)
        {
            Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
        }
        else
        {           
            for(int i=0; i<actorsList.size(); i++)
            {
                ImageView image = new ImageView(getApplicationContext());              

                Picasso.with(MainActivity.this)
                .load(actorsList.get(i).toString())
                .placeholder(R.drawable.ic_launcher)
                .error(R.drawable.ic_launcher)
                .into(image);

                viewFlipper.addView(image); // addView(..) method
            }           


            int mDelay = 0;
            for(int i=0; i<periodsList.size(); i++)
            {
             Log.d("period:post- ", String.valueOf(periodsList.get(i)));
             timer.schedule(new TimerTask() {

                public void run() {
                    mHandler.post(mUpdateResults);
                }
            }, mDelay);

            mDelay = mDelay  + periodsList.get(i);

          }
         }
       }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-10-10 12:11:40

你得再做一个艺术家。

在这个列表中,您只需要添加句点(就像对actorsList那样)

主类添加

代码语言:javascript
复制
ArrayList<Integer> periods;

在onCreate()

代码语言:javascript
复制
periods=new ArrayList<Integer>();

在doInBackground中

代码语言:javascript
复制
try {
     periods.add(Integer.parseInt(object.getString("period").toString()));

    Log.d("period: ", object.getString("period"));
    } catch (NumberFormatException nfe) {
    System.out.print("could not parse:" + nfe);
}  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26298679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档