安卓如何为异步获取方法设置延迟响应超时



我想设置超时,如果数据无法在 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);
    }
}

你必须调用 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);

你必须使用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);
    }

最新更新