首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免一次又一次从JSON中获取数据

避免一次又一次从JSON中获取数据
EN

Stack Overflow用户
提问于 2016-04-07 05:06:45
回答 5查看 171关注 0票数 1

我在MainActivity中解析来自服务器的JSON数据,但是每当我切换到另一个活动,然后再次调用MainActivity.问题来了,它再次访问JSON url,再次从JSON获取数据。

为什么?而我已经从JSON下载了数据

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

    ArrayList<Actors> actorsList;

    ActorAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        actorsList = new ArrayList<Actors>();
        new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors");

        ListView listview = (ListView)findViewById(R.id.list);
        adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList);

        listview.setAdapter(adapter);

        listview.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long id) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();              
            }
        });
    }


    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {

        ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setMessage("Loading, please wait");
            dialog.setTitle("Connecting server");
            dialog.show();
            dialog.setCancelable(false);
        }

        @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("actors");

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

                        Actors actor = new Actors();

                        actor.setName(object.getString("name"));
                        actor.setDescription(object.getString("description"));
                        actor.setDob(object.getString("dob"));
                        actor.setCountry(object.getString("country"));
                        actor.setHeight(object.getString("height"));
                        actor.setSpouse(object.getString("spouse"));
                        actor.setChildren(object.getString("children"));
                        actor.setImage(object.getString("image"));

                        actorsList.add(actor);
                    }
                    return true;
                }

                //------------------>>

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

        protected void onPostExecute(Boolean result) {
            dialog.cancel();
            adapter.notifyDataSetChanged();
            if(result == false)
                Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();

        }
    }   
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-07 05:18:26

尝试使用静态变量

代码语言:javascript
复制
 static boolean flag=false;
 static ArrayList<Actors> actorsList;

然后,在调用AsyncTask之前,检查是否为true或false

代码语言:javascript
复制
if(!flag){
 actorsList = new ArrayList<Actors>(); //use this inside if statement
 new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors");
flag=true;
}

因此,只有当标志为false时,异步任务才会执行.希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-04-07 05:35:03

根据你的评论"I am calling MainActivity from SecondActivity using onBackPressed() and also calling MainActivity from ThirdActivity using Intent.

在SecondActivity onBackPressed():简单地调用finish()不会重新加载MainActivity,因此它不会重新加载和调用web服务。

另一个选项是有一个标志,保存在shared preferences中。

步骤:

  1. 当第一次调用服务时,将标志didCallService = true保存到共享首选项。将json响应也保存在shared preference中作为字符串。
  2. 当您从其他2个活动到达onCreate() on MainActivity时,检查来自用户默认值的didCallService是否为真。如果是这样,请不要再次调用该服务。
票数 1
EN

Stack Overflow用户

发布于 2016-04-07 05:20:26

接受一个boolean变量并将其初始化为true,并将其状态保存为sharedpreference。现在,当MainActivity启动时,检查此boolean是否为真或不使用sharedpreference。如果为真,则获取JSON并将boolean转换为false,并将boolean状态保存为sharedpreference。在此之后,每当调用MainActivity时,由于布尔值为false,将不会获取JSON

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36467127

复制
相关文章

相似问题

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