![](/img/trans.png)
[英]how to store data retrieved from database into a variable so that I can avoid hitting database again
[英]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
保存一個標志。
腳步:
在第一次調用服務時,將標志didCallService = true
保存到共享首選項。 將json
響應也作為字符串保存在hared preference
中。
當您從其他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,因此在代碼中添加上述條件。
在AndroidManifest.xml
文件中,將此屬性添加到MainActivity
,
<activity ..
android:launchMode= "singleTask" />
這將重新加載MainActivity的實例,並且不會調用onCreate()
,而是可以在onNewIntent()
方法中使用新的intent。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.