我有一个新闻应用程序,我在那里获取一对XML和API,并立即插入数据库。在获取/插入到数据库过程中,我正在使用AsyncTask。不过,我仍然获得了块(用户界面不会没有反应)AsyncTask仍然阻止用户界面(用户界面没有响应)
for (int i = 0; i < urls.size(); i++) {
MyAsyncTask myAsyncTask = new MyAsyncTask(urls.get(i));
myAsyncTask.execute();
}
的的AsyncTask类:
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);
}
}
}
connect方法:
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);
}
的VolleySingleton类:
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);
}
}
请向我们展示'StringRequest'类以及您如何管理'VolleySingleton' – alfasin
添加了VolleySingleton和StringRequest是使用Android Volley Libarary的对象(mcxiaoke.volley:library) – busted13