Android如何设置异步get方法的延迟响应超时

时间:2014-02-07 10:27:14

标签: android http timer android-asynctask

如果数据无法在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);

    }
}

2 个答案:

答案 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);
    }