2013-12-04 2 views
0

Я установил следующий код в doInBackground() в другом AsyncTask, который содержит HttpPostHandler еще AsyncTask. Затем handler.get() просто продолжайте загрузку.
У кого-нибудь есть представление об этом?
Это проблема о потоках ???Async в задаче Async

Код:

@Override 
    protected Void doInBackground(Void... params) { 
     try { 
       champ = Utility.getCounter("test"); 

       this.wait(3); 
       } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

В утилите:

public static int getCounter(String code) { 
    HttpPostHandler handler = new HttpPostHandler(); 
    try { 
     handler.execute(counter_URL + code); 
     handler.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
    String html = handler.getResultJSONString(); 
    TagNode tagNode; 

    ... 
} 

Ниже приводится HttpPostHandler AsyncTask

public class HttpPostHandler extends AsyncTask<String, Void, String> { 

     private String url; 
     private String resultJSONString=null; 
     private JSONObject resultJSON; 

     public String getResultJSONString() { 
      return resultJSONString; 
     } 

     public void setResultJSONString(String resultJSONString) { 
      this.resultJSONString = resultJSONString; 
     } 

     private static String toUTF8(InputStream is){ 
      //InputStream is = resEntity.getContent(); 
      InputStreamReader isr = null; 
      StringBuffer buffer = new StringBuffer(); 
      try { 
       isr = new InputStreamReader(is, "utf-8"); 
       Reader in = new BufferedReader(isr); 
       int ch; 
       while((ch = in.read()) != -1){ 
        buffer.append((char)ch); 
       } 
       isr.close(); 
       is.close(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
      return buffer.toString(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
       String result = ""; 
       DefaultHttpClient client = new DefaultHttpClient(); 
       try { 
        HttpGet get = new HttpGet(params[0]); 
        HttpResponse response = client.execute(get); 
        Log.d("danny", "response = "+response); 
        HttpEntity resEntity = response.getEntity(); 
        if (resEntity != null) { 
         result = toUTF8(resEntity.getContent()); 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        client.getConnectionManager().shutdown(); 
       } 
       setResultJSONString(result); 
       return result; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      resultJSONString = result; 
     } 
    } 

ответ

1

Если вы работаете в API 11 (3.0) или более поздней версии , вы можете изменить свой handler.execute(counter_URL + code); на handler.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, counter_URL + code);

Это позволяет одновременно запускать несколько AsyncTasks.

+0

Это работает для меня! Можете ли вы объяснить мне больше, как это решило это? Это означает, что мой основной поток застрял в handler.get() ?? thx ~ –

+0

Android по умолчанию разрешает запуск одной AsyncTask сразу (возможно, чтобы избежать многопоточных проблем?) Не слишком уверен. В API 11 они ввели метод executeOnExecutor, который позволяет одновременно запускать более одного экземпляра AsyncTask. – Pheel125

+0

Но мой оригинальный handler.get() просто не останавливает загрузку вместо медленной загрузки. Так что я понятия не имею, почему многопоточная помощь помогает? thx ~ –

1

Использовать метод публикации asynctask в doinbackground() вместо прямого вызова «handler.execute».

Вызов "handler.execute" в onprogressupdate() и вызов публикации в doInBackground.

+0

Не могли бы вы подробнее рассказать о «Использовать метод публикации публикации» thx ~ –

1

Вот пример публикации прогресса:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
protected Long doInBackground(URL... urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
     totalSize += Downloader.downloadFile(urls[i]); 
     publishProgress((int) ((i/(float) count) * 100)); 
     // Escape early if cancel() is called 
     if (isCancelled()) break; 
    } 
    return totalSize; 
} 

protected void onProgressUpdate(Integer... progress) { 
    setProgressPercent(progress[0]); 
} 

protected void onPostExecute(Long result) { 
    showDialog("Downloaded " + result + " bytes"); 
} 

}

пожалуйста voteup или пометить верно, если это полезно для вас.

Смежные вопросы