我正在从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();
}
}
}
答案 0 :(得分:2)
尝试使用静态变量
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时才会执行异步任务... 希望这会有所帮助。
答案 1 :(得分:1)
根据您的评论&#34; I am calling MainActivity from SecondActivity using onBackPressed() and also calling MainActivity from ThirdActivity using Intent.
&#34;
在SecondActivity onBackPressed():简单地调用finish()
将不会重新加载MainActivity,因此它不会重新加载并再次调用Web服务。
另一种选择是拥有一个标记,保存在shared preferences
。
步骤:
首次调用服务时,将标记didCallService = true
保存到共享首选项。将json
响应也保存在s hared preference
中作为字符串。
当您从其他2个活动到onCreate()
MainActivity
时,请检查用户默认值中的didCallService
是否为真。如果是这样,请不要再次拨打该服务。
答案 2 :(得分:0)
获取一个boolean
变量并将其初始化为true,并将其状态保存到sharedpreference
。现在MainActivity
启动时,请使用boolean
检查此sharedpreference
是否为真。如果属实,请抓取JSON
并将boolean
设置为false,并将boolean
的状态保存到sharedpreference
。现在,每当调用MainActivity
时,因为boolean为false,将不会获取JSON
。
答案 3 :(得分:0)
您可以使用“savedInstanceState”varibale来检查以下代码
if(savedInstanceState==null)
{
new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors");
}
第一次启动活动时,如果t有值,则savedInstanceState为null,因此在代码中添加上述条件。
答案 4 :(得分:0)
在您的AndroidManifest.xml
文件中,将此媒体资源添加到MainActivity
,
<activity ..
android:launchMode= "singleTask" />
这将重新加载MainActivity的实例,并且不会调用onCreate()
,而是可以在onNewIntent()
方法中使用新意图。