[英]how to make the asynctask run in background even the activity destroyed?
我正在做一些asynctask方法,但是我不確定如何關閉應用程序時使其在后台繼續運行。 有人說它可以與Service一起使用或將代碼放在doinbackground中,但是我不確定如何實現它。 順便說一句,這是我的代碼:
private class DataBinatangOperation extends AsyncTask<String, Void, String> {
MainMenuAdapter adapter = new MainMenuAdapter(MainMenu.this,
listBinatang);
@Override
protected String doInBackground(String... params) {
JSONArray json;
try {
result = JSONParser.getPage(url);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
//updateList();
tv.setVisibility(View.GONE);
//mSwipeRefreshLayout.setRefreshing(false);
try {
System.out.print("result = " + result);
json = new JSONObject(result);
progress.dismiss();
JSONArray objek = json.getJSONArray("data_vaksinasi_menu");
for (int i = 0; i < objek.length(); i++) {
JSONObject jo = objek.getJSONObject(i);
ID_USER = jo.getString(id_user);
ID_BINATANG = jo.getString(id_binatang);
NAMA_BINATANG = jo.getString(nama_binatang);
JENIS_BINATANG = jo.getString(jenis_binatang);
FOTO_BINATANG = jo.getString(foto_binatang);
TANGGAL_VAKSIN = jo.getString(tanggal_vaksin);
NAMA_VAKSIN = jo.getString(nama_vaksin);
RAS_BINATANG = jo.getString(ras_binatang);
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
Calendar waktuSekarang = Calendar.getInstance();
Date date1 = waktuSekarang.getTime();
Date date2 = new Date();
date2 = formatter.parse(TANGGAL_VAKSIN);
/*waktuVaksin.setTime(date2);
DateMidnight start = new DateMidnight(tanggalSkrg);
DateMidnight vaksin = new DateMidnight(TANGGAL_VAKSIN);*/
if (pref.getPreferences("ID").equals(ID_USER)) {
if (date2.after(date1)) {
int days = Days.daysBetween(new DateTime(date1), new DateTime(date2)).getDays();
if (days > 7 && days <= 30) {
int weeks = days / 7;
sisaWaktu = String.valueOf(weeks) + " minggu";
} else if (days > 30 && days <= 365) {
int months = days / 30;
sisaWaktu = String.valueOf(months) + " bulan";
} else if (days > 365) {
int years = days / 365;
sisaWaktu = String.valueOf(years) + " tahun";
} else {
sisaWaktu = String.valueOf(days) + " hari";
if (days <= 5) {
NH.createSimpleNotification(getActivity(), NAMA_BINATANG, sisaWaktu, ID_BINATANG);
}
}
} else if (date2.before(date1)) {
int days = Days.daysBetween(new DateTime(date2), new DateTime(date1)).getDays();
sisaWaktu = "lewat " + String.valueOf(days) + " hari";
NH.createButtonNotification(getActivity(), NAMA_BINATANG, sisaWaktu, ID_BINATANG);
} else if (date2.equals(date1)) {
sisaWaktu = "sekarang";
NH.createButtonNotification(getActivity(), NAMA_BINATANG, sisaWaktu, ID_BINATANG);
}
}
HashMap<String, String> map = new HashMap<String, String>();
map.put(id_binatang, ID_BINATANG);
map.put(nama_binatang, NAMA_BINATANG);
map.put(jenis_binatang, JENIS_BINATANG);
map.put(foto_binatang, urlgambar+FOTO_BINATANG);
map.put(ras_binatang, RAS_BINATANG);
map.put(tanggal_vaksin, sisaWaktu);
map.put(nama_vaksin, NAMA_VAKSIN);
if (pref.getPreferences("ID").equals(ID_USER)) {
listBinatang.add(map);
}
}
System.out.println("hasil list : " + String.valueOf(listBinatang));
System.out.println("adapter : " + String.valueOf(adapter));
list.setAdapter(adapter);
/*list.setVisibility(View.VISIBLE);*/
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long idx) {
HashMap<String, String> ambilid = new HashMap<String, String>();
ambilid = listBinatang.get(position);
Toast.makeText(getActivity(), "pindah halaman", Toast.LENGTH_SHORT).show();
Intent a = new Intent(getActivity(), MainPetInformation.class);
pref.savePreferences("IDB", ambilid.get(MainMenu.id_binatang));
pref.savePreferences("NAMAB", ambilid.get(MainMenu.nama_binatang));
pref.savePreferences("FOTOB", ambilid.get(MainMenu.foto_binatang));
pref.savePreferences("JENISB", ambilid.get(MainMenu.jenis_binatang));
pref.savePreferences("RASB", ambilid.get(MainMenu.ras_binatang));
startActivity(a);
}
});
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
}
@Override
protected void onPreExecute() {
listBinatang.clear();
adapter.notifyDataSetChanged();
progress = ProgressDialog.show(getActivity(), "Please Wait",
"Loading Data", true);
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
受保護的抽象對象doInBackground(Object ... params)
是AsyncTask中的方法,該方法在主線程(也稱為UI線程)的后台執行操作,該方法用於執行需要在主線程(網絡)上執行的操作,或者您想要不執行的操作防止負面的用戶體驗(例如一項任務,該任務將阻止用戶在任務完成之前進一步使用該應用)。
這是有關Service的簡潔明了的教程,確實是您所需要的: http : //www.vogella.com/tutorials/AndroidServices/article.html 。 服務可以像AsyncTask的doInBackground方法一樣在后台執行操作,但是可以按照您所說的在后台運行應用程序來執行操作,並且在需要時可以間隔執行操作。
我可以對此進行更深入的研究,但是該教程包含了您需要的所有信息,我懷疑這正是您所需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.