2016-04-07 3 views
1

Я анализирую данные JSON с сервера в MainActivity, но всякий раз, когда я переключаюсь на другую активность, а затем снова вызываю MainActivity ... здесь возникает проблема, она снова попадает на URL JSON, снова извлекает данные от 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; 
} 

так, только если флаг false, задача async выполняется ... Надеюсь, это поможет.

+0

Да, теперь его не ударил JSON api снова, но даже не показывал существующие данные в ListView ... что может быть причиной? – Oreo

+0

@Oreo Its Не нажимать на api. Как вы могли получить данные в своем списке, потому что вы arraylist заполняют вашу асинхронную задачу. Вы должны использовать singleton Approach, чтобы сохранить полученные данные, вызвав ваш api в первый раз. –

+0

есть ли исключение? – Benedict

0

Возьмите одну переменную boolean и инициализируйте ее до истины, а также сохраните ее состояние до sharedpreference. Теперь, когда начинается MainActivity, проверьте, верно ли это boolean, с помощью sharedpreference. Если это правда, введите JSON и поверните boolean на значение false, а также сохраните состояние boolean до sharedpreference. Теперь после этого, когда вызывается MainActivity, поскольку логическое значение false, JSON не будет выбрано.

0

вы можете использовать «savedInstanceState» varibale для этой цели, пожалуйста, проверьте ниже код

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

первый раз, когда вы начинаете деятельность его savedInstanceState равна нулю в следующий раз т имеет значение так добавить выше условия в вашем коде.

+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, следовательно, он не перезагружается, и снова вызов веб-службы.

Другой вариант - иметь флаг, сохраненный в shared preferences.

Шаги:

  1. Сохранить флаг, didCallService = true в общих настройках, когда услуга называется первый раз. Сохраните ответ json также в s hared preference как строку.

  2. Когда вы достигнете onCreate() по MainActivity из других 2 видов деятельности, проверьте, действительно ли didCallService от пользовательских значений по умолчанию. Если это так, не вызывайте службу снова.

0

Использование singleTask

В файле AndroidManifest.xml добавить это свойство в MainActivity,

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

Это перезагрузит экземпляр MainActivity и onCreate() не будет называться, вместо того, чтобы новая цель будет доступный для использования в методе onNewIntent().

+0

попытался по-прежнему ударить JSON api, когда я прихожу из SecondActivity в MainActivity – Oreo

+0

Я не верю в это, у вас есть код для извлечения только в onCreate() и по-прежнему с помощью singleTask, MAGICAL.! – MKJParekh

+0

Поверь мне, приятель .... – Oreo