еще короче, используя точку:
#! / bin / bash. CONFIG_FILE sudo -u wwwrun svn up / srv / www / htdocs / $ production sudo -u wwwrun svn up / srv / www / htdocs / $ playchool
Как подразумевается вышеупомянутой библиотекой, вы можете выполнять сетевые вызовы асинхронно, то есть не в основном потоке, и поэтому мы фактически используем asynctask, чтобы избежать блокировки основного потока.
Итак, если вы используете выше библиотеки, тогда нет необходимости использовать Asynctask
, и я уверен, что вы никогда не получите NetworkConnectionOnMainThreadException
. Надеюсь, это поможет.
Прежде всего, асинктас - это синхронное выполнение, а AsyncHttpClient - одновременное выполнение. Не используйте клиент внутри asynctask. Используйте только AsyncHttpclient, как это. Создайте общий обработчик запросов и прослушиватель. Вы также можете создавать различные методы запроса, такие как makeRequest для каждого запрошенного вами запроса, а также создавать разные слушатели.
public class RequestHandler{
private static RequestHandler instance;
private AsyncHttpClient client;
private RequestHandler(){
client = new AsyncHttpClient();
}
public static RequestHandler getInstance(){
if(instance == null){
instance = new RequestHandler();
}
return instance;
}
// You can add more parameters if you need here.
public void makeRequest(String url, RequestListener listener){
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
//Some debugging code here
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
listener.onSuccess(statusCode, headers, response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable exception) {
listener.onFailure(statusCode, headers, errorResponse,exception);
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
//Some debugging code here, show retry dialog, feedback etc.
}
@Override
public void onRetry(int retryNo) {
//Some debugging code here-------
}
});
}
}
public interface RequestListener{
public void onSuccess(int statusCode, Header[] headers, byte[] response);
public void onFailure(int statusCode, Header[] headers, byte errorResponse, Throwable e);
}
Дать этот запрос url, как это из активности или фрагмента
RequestHandler handler = RequestHandler.getInstance();
handler.makeRequest("http://www.google.com", new RequestListener(){
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// do whatever you want here.
}
});
Используйте только async-http-client и просто устанавливайте таймауты следующим образом:
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
public MyClassConstructor(){
asyncHttpClient.setConnectTimeout(5000); // default is 10 seconds, minimum is 1 second
asyncHttpClient.setResponseTimeout(5000); // as above
asyncHttpClient.setTimeout(5000); // both connection and socket timeout
asyncHttpClient.setMaxRetriesAndTimeout(1, 100); // times, delay
Надеемся, что это поможет
С AsyncHttpClient вы можете легко обрабатывать тайм-ауты с помощью инструкции типа:
client.setTimeout(5000)
Проверить документы библиотеки для всех доступных методов.
Если вы используете эту библиотеку, вам не нужно использовать класс AsyncTask для запросов.
Внутри вашего кода активности вы можете просто добавить что-то вроде этого:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
Это автоматически отправит запрос в фоновом потоке. Внутри onSuccess вы можете иметь дело с ответом (похоже на onPostExecute, но я думаю, что это не на тему пользовательского интерфейса).