lundi 9 mars 2015

Listeners create a new Thread (or something). How to kill it on close a fragment?



I have a pre-loading fragment code that must run linearly like this:



JsonArrayRequest req = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {

Context context = getActivity();
ArrayList<HashMap> itemList = new ArrayList<>();

@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
JSONObject c = response.getJSONObject(i);
HashMap<String, String> item = new HashMap<>();
Iterator<?> keys = c.keys();

while (keys.hasNext()) {
String key = (String) keys.next();
item.put(key, c.getString(key));
}
itemList.add(item);
}

} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(context,
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}

TextView desc = (TextView) ncontent.findViewById(R.id.Desc);
TextView place = (TextView) ncontent.findViewById(R.id.Place);
TextView date = (TextView) ncontent.findViewById(R.id.Date);

NetworkImageView image = (NetworkImageView) ncontent.findViewById(R.id.Image);

HashMap i = itemList.get(0);

desc.setText(i.get("desc").toString());
place.setText(i.get("place").toString());
date.setText(i.get("date").toString());

ImageLoader imageLoader = DataController.getInstance(getActivity()).getImageLoader();
image.setImageUrl("http://192.168.0.101/" + i.get("image").toString(), imageLoader);

LruBitmapCache lruBitmapCache = new LruBitmapCache();
lruBitmapCache.getBitmap("http://192.168.0.101/" + i.get("image").toString());
}
}, null);

DataController.getInstance(getActivity()).addToRequestQueue(req);


The problem is that when I insert some Listener as the following, this creates a background process when the fragment is closed it continues to run.



imageLoader.get("http://192.168.0.101/" + i.get("image").toString(), new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
Image = (ImageView) ncontent.findViewById(R.id.Image);
Image.setImageBitmap(response.getBitmap());
}
} });


Closing the fragment before the algorithm run returns me the following error:



java.lang.IllegalStateException: Fragment Details3{3e80163e} not attached to Activity


I want to kill any procedure that is running when you close the fragment.




Aucun commentaire:

Enregistrer un commentaire