2016-04-07 98 views
1

我從MainActivity中的服務器解析JSON數據,但每當我切換到另一個活動,然後再次調用MainActivity時...這裏出現問題,它再次擊中JSON url,再次獲取來自JSON的數據。避免從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(); 

     } 
    } 
} 
+0

您可以通過標記來解決這個問題 –

+0

當您的射擊意圖用於其他活動時您是否完成了MainActivity – Pavya

+0

您可以在SharedPreference中放置一個標誌並檢查該標誌。 –

回答

2

嘗試使用一個靜態變量

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

然後調用的AsyncTask檢查,如果標誌是真還是假

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

所以只有前旗是假的異步任務執行... 希望這會有所幫助。

+0

是的,現在它不再打JSON API,但即使沒有顯示現有的數據到ListView ...可能是什麼原因? – Oreo

+0

@Oreo它不會觸及api,那麼如何才能在列表視圖中獲取數據,因爲ArrayList正在推廣您的異步任務。您應該使用單例方法來保存通過調用api獲取的數據以獲取第一時間的數據。 –

+0

是否有被調用的異常? – Benedict

0

取一個boolean變量並將其初始化爲true,並將其狀態保存爲sharedpreference。現在,當MainActivity開始時,請檢查此boolean是否爲真或使用sharedpreference。如果屬實,則取JSON並將boolean設置爲false,並將boolean的狀態保存爲sharedpreference。此後每調用一次MainActivity之後,由於布爾值爲false,將不會提取JSON

0

當你開始活動了savedInstanceState爲空下一時間t值,以便在代碼中添加上述條件,你可以使用「savedInstanceState」 varibale爲此,請檢查下面的代碼

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

第一次。

+0

它有助於您回覆評論? –

+0

試過這個:http://pastebin.com/fCLZDXK4請讓我知道我失蹤了什麼? – Oreo

+0

它是否引發任何錯誤 –

1

根據您的評論「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響應也作爲字符串保存在s hared preference中。

  2. 當您通過MainActivity從其他2項活動到達onCreate()時,請檢查didCallService來自用戶的默認值是否爲true。如果是這樣,請不要再撥打該服務。

0

使用singleTask

在你AndroidManifest.xml文件中添加此屬性MainActivity

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

這將重新加載MainActivity和onCreate()的情況下將不會被調用,而不是新的意圖將是可用於onNewIntent()方法。

+0

嘗試仍然擊中JSON API,當我從SecondActivity來MainActivity – Oreo

+0

我不相信這個,你有代碼只在onCreate()獲取,仍然與singleTask,魔術獲取。 – MKJParekh

+0

相信我的好友.... – Oreo

相關問題