簡體   English   中英

避免一次又一次地從JSON中獲取數據

[英]Avoid Fetching Data from JSON again and again

我正在從MainActivity中的服務器解析JSON數據但是每當我切換到另一個Activity然后再次調用MainActivity時......問題出現了,它再次點擊JSON url,再次從JSON獲取數據。

為什么? 而我已經從JSON下載了數據

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();

        }
    }   
}

嘗試使用靜態變量

 static boolean flag=false;
 static ArrayList<Actors> actorsList;

然后在調用AsyncTask之前檢查flag是true還是false

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

所以只有當標志為false時才會執行異步任務...希望這會有所幫助。

根據你的評論“ 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響應也作為字符串保存在hared preference中。

  2. 當您從其他2個活動到達MainActivity上的onCreate() ,檢查來自用戶默認值的didCallService是否為true。 如果是這樣,請不要再次呼叫該服務。

取一個boolean變量並將其初始化為true,並將其狀態保存到sharedpreference 現在,當MainActivity啟動時,使用sharedpreference檢查此boolean是否為true。 如果為true,則獲取JSON並將boolean為false,並將boolean狀態保存為sharedpreference 現在,每當調用MainActivity ,因為boolean為false,所以不會獲取JSON

您可以使用“savedInstanceState”varibale來檢查以下代碼

if(savedInstanceState==null)
{
     new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors");
}

第一次啟動活動時,如果t有值,則savedInstanceState為null,因此在代碼中添加上述條件。

使用singleTask

AndroidManifest.xml文件中,將此屬性添加到MainActivity

<activity ..
      android:launchMode= "singleTask" />

這將重新加載MainActivity的實例,並且不會調用onCreate() ,而是可以在onNewIntent()方法中使用新的intent。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM