2015-10-10 63 views
2

我有一个新闻应用程序,我在那里获取一对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); 
    } 
} 
+0

请向我们展示'StringRequest'类以及您如何管理'VolleySingleton' – alfasin

+0

添加了VolleySingleton和StringRequest是使用Android Volley Libarary的对象(mcxiaoke.volley:library) – busted13

回答

1

那是因为你正在更新mProgress的进度。所以这就是为什么它给错误。更新onProgressUpdate方法AsyncTask中的进度。

+0

检查我的更新,仍然UI被阻止,似乎没有问题 – busted13

+1

好。 但是onPostExecute只会在doInBackground后被调用一次。 –

+0

是的我知道,我检查我的布尔数组是否全部为真,如果是的话我充气数据,因为所有的网站都被提取并插入到数据库中 – busted13

0

看起来很奇怪你的项目在AsyncTask里面使用了Volley,我从未做过这样的事情。

我建议大家,供大家参考以下问题看我的答案:

Android Volley: Static vs Object

POST Request Json file passing String and wait for the response Volley

中,你会发现我使用Interface如下所示:

public interface VolleyResponseListener { 
    void onError(String message); 

    void onResponse(Object response); 
} 

然后我通过VolleyResponseListener作为方法的一个参数,在你的情况就是connect方法。

回到你的问题,国际海事组织,你只需要打电话给你的凌空请求你的主线程(我的意思是stringRequest = new StringRequest...直接调用内部onCreate例如)

希望这有助于!