如果数据无法在15秒内完成,我想设置超时。我使用异步方法从服务器获取数据。我尝试了一些代码中显示的内容。我使用get(15000, TimeUnit.MILLISECONDS);
,它等待15秒并且松开连接仍然能够在15秒内获取数据。我还在doInBackground()
中使用了计时器,但是它有同样的问题。 我希望超时15秒,如果数据无法及时显示“连接问题”对话框。请提前帮助我。谢谢。
班级
class GetTAsk extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... uri) {
//HttpParams params = new BasicHttpParams();
//HttpConnectionParams.setConnectionTimeout(params,15000);
//HttpConnectionParams.setSoTimeout(params,15000);
//DefaultHttpClient client = new DefaultHttpClient(params);
HttpClient httpClient = new DefaultHttpClient();
final HttpGet httpGet = new HttpGet(uri[0]);
//httpGet.setParams(params);
HttpResponse response = null;
String responseString = null;
requestTime = new Date();
Log.i(l,"URL: "+uri[0]);
try {
response = httpClient.execute(httpGet);
Log.i(l,""+response.getStatusLine().toString());
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
responseString = out.toString();
} else{
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
/*new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
httpGet.abort();
Log.e("LOG","request aborted");
progressBar.cancel();
cancel();
}
},1000);
*/
try {
get(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (isCancelled()) {
Log.e("LOG","the task is cancelled");
progressBar.cancel();
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
答案 0 :(得分:1)
你必须调用httpClient.setParams(httpParameters)才能工作..
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
httpClient.setParams(httpParameters);
HttpResponse response = httpClient.execute(httpGet);
答案 1 :(得分:0)
你必须使用Hander
public Handler myTaskHandler;
Runnable Task = new Runnable() {
@Override
public void run() {
//your code
myTaskHandler.postDelayed(this, 1000);
}
}
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
myTaskHandler = new Handler();
}
//this is just as demo example, we will start the task when the activity is started.
@Override
public void onStart() {
super.onStart();
myTaskHandler.postDelayed(myTask, 1000);
}
//at some point in your code you will probably want the handler to stop (in onStop is a good place)
@Override
public void onStop() {
super.onStop();
myTaskHandler.removeCallbacks(myTask);
}