Я установил следующий код в 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;
}
}
Это работает для меня! Можете ли вы объяснить мне больше, как это решило это? Это означает, что мой основной поток застрял в handler.get() ?? thx ~ –
Android по умолчанию разрешает запуск одной AsyncTask сразу (возможно, чтобы избежать многопоточных проблем?) Не слишком уверен. В API 11 они ввели метод executeOnExecutor, который позволяет одновременно запускать более одного экземпляра AsyncTask. – Pheel125
Но мой оригинальный handler.get() просто не останавливает загрузку вместо медленной загрузки. Так что я понятия не имею, почему многопоточная помощь помогает? thx ~ –