I have a news app where I fetch a couple of XMLs and APIs and insert into database at once. I'm using AsyncTask during the fetching/inserting into Database process. However I still get a block(UI Doesn't not respond)
for (int i = 0; i < urls.size(); i++) {
MyAsyncTask myAsyncTask = new MyAsyncTask(urls.get(i));
myAsyncTask.execute();
}
The AsyncTask class:
private class MyAsyncTask extends AsyncTask<Void,Void,Void> {
Url mUrl;
public MyAsyncTask(Url url){
this.mUrl = url;
}
@Override
protected Void doInBackground(Void... params) {
connect(mUrl.getUrl(),mUrl.getSourceName(),mUrl.getChoice(),mUrl.getId());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
whenToInflate[mUrl.getId()] = true;
mProgressState += 15;
mProgress.setProgress(mProgressState);
if (areAllTrue(whenToInflate)) {
inflate(1907);
Arrays.fill(whenToInflate, false);
}
}
}
The connect method:
private void connect(String url, final String sourceSite, final int sourceChoice, final int i) {
stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
if (sourceChoice == 14) {
database.insertFixtures(response, "FOOTBALL");
} else if (sourceChoice == 10 || sourceChoice == 20) {
database.insertNews(response, sourceChoice);
} else {
if (sourceChoice == 1) response = URLDecoder.decode(URLEncoder.encode(response, "iso8859-1"), "UTF-8");
database.insertNewsXML(response, sourceSite, sourceChoice);
}
} catch (IllegalStateException | IllegalArgumentException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
VolleySingleton.getInstance(getActivity()).addToRequestQueue(stringRequest);
}
The VolleySingleton class:
public class VolleySingleton {
private static VolleySingleton instance;
private static VolleySingleton ourInstance = new VolleySingleton();
private RequestQueue requestQueue;
private VolleySingleton() {
}
private VolleySingleton(Context context) {
requestQueue = Volley.newRequestQueue(context);
}
public static VolleySingleton getInstance() {
return ourInstance;
}
public static VolleySingleton getInstance(Context context) {
if (instance == null) {
instance = new VolleySingleton(context);
}
return instance;
}
public RequestQueue getRequestQueue() {
return requestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag("App");
getRequestQueue().add(req);
}
}