Eğer ayarlayabilirsiniz HTTP Bağlantısı zaman aşımına uğramaz, Zamanaşımı denetleyicisini arka plan iş parçacığının kendisinde uygulayabilirsiniz (AsyncTask, Service, vb.), aşağıdaki sınıf bir sınavdır. belirli bir süre
public abstract class AsyncTaskWithTimer<Params, Progress, Result> extends
AsyncTask<Params, Progress, Result> {
private static final int HTTP_REQUEST_TIMEOUT = 30000;
@Override
protected Result doInBackground(Params... params) {
createTimeoutListener();
return doInBackgroundImpl(params);
}
private void createTimeoutListener() {
Thread timeout = new Thread() {
public void run() {
Looper.prepare();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (AsyncTaskWithTimer.this != null
&& AsyncTaskWithTimer.this.getStatus() != Status.FINISHED)
AsyncTaskWithTimer.this.cancel(true);
handler.removeCallbacks(this);
Looper.myLooper().quit();
}
}, HTTP_REQUEST_TIMEOUT);
Looper.loop();
}
};
timeout.start();
}
abstract protected Result doInBackgroundImpl(Params... params);
}
Basit çizgi
HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");
eklenmesiyle böyle benzer bir sorun için bir çözüm alabilir bu
public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer<Void, Void, Void> {
@Override
protected void onCancelled(Void void) {
Log.d(TAG, "Async Task onCancelled With Result");
super.onCancelled(result);
}
@Override
protected void onCancelled() {
Log.d(TAG, "Async Task onCancelled");
super.onCancelled();
}
@Override
protected Void doInBackgroundImpl(Void... params) {
// Do background work
return null;
};
}
Değeri 10 dakikaya ayarlıyorum. Ancak bana bir java.net.ConnectException atar: Bağlantı zaman aşımına uğradı: connect 'önce bile 2 dakika doldu. Soruna neyin neden olduğunu biliyor musun? – Pacerier
@dbyrne bana biraz kafa karıştırıcı geliyor - HttpURLConnection nesnesi oluşturulduktan sonra zaman aşımını ayarladığımızdan beri, kodda SocketTimeoutException öğesini yükseltecek olan yerin tam olarak ne olduğunu merak ediyorum. – Less
SocketTimeoutException, IOException'ın bir alt sınıfıdır. Her iki yakalama bloğu da aynı şeyi yaparsa, IOException'ı yakalayabilirsiniz. – spaaarky21