2013-01-31 98 views
2

是否有可能执行启动画面来执行HTTP请求,如果此请求执行时间过长(即7-10秒),则中止请求并跳转到主要活动?Android:AsyncTask timeout

下面的代码是我做的,但它不工作 - 超时不起作用,HTTP请求和跳跃正在工作。据我所知,有可能延迟使用AsyncTaskget()方法或处理程序。 Get()方法应该在单独的线程中,但它不起作用。如何做这个任务?

编辑:

public class SplashActivity extends Activity { 
private static final String TAG = "SplashActivity"; 
private Handler handler = new Handler(); 
private Runnable r; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash_layout); 

    if (Helpers.isNetworkConnected(getApplicationContext())) { 
     Log.d(TAG, "Has Internet"); 
     final DownloadFAQ downloadFAQ = new DownloadFAQ(); 
     new Thread(new Runnable() { 
      public void run() { 
       try { 
        Log.d(TAG, "Timing..."); 
        downloadFAQ.execute().get(1000, TimeUnit.MILLISECONDS); 

        SplashActivity.this.runOnUiThread(new Runnable() { 
         public void run() { 
          Log.d(TAG, "redirect"); 
          redirect(); 
         } 
        }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } catch (TimeoutException e) { 
        downloadFAQ.cancel(true); 
        Log.d(TAG, "Task has benn canceled"); 
        if (downloadFAQ.isCancelled()) 
         redirect(); 
       } 
      } 
     }).start(); 
    } else { 

     r = new Runnable() { 
      public void run() { 
       redirect(); 
      } 
     }; 
     handler.postDelayed(r, 2500); 
    } 
} 

private class DownloadFAQ extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     Log.d(TAG, "Execute task"); 
     ServerAPI server = new ServerAPI(getApplicationContext()); 
     server.serverRequest(ServerAPI.GET_FAQ, null); 
     return null; 
    } 
} 

private void redirect() { 
    Intent i = new Intent(SplashActivity.this, TabsActivity.class); 
    startActivity(i); 
    finish(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    handler.removeCallbacks(r); 
} 

}

+0

为什么要再次调用downloadFAQ.get方法时的AsyncTask仍在运行? –

+0

据我所知,get()方法应该在单独的线程中调用。我试图把这个线程放在doinback的onPostExec主线程中。它看起来并不如此。 – user1376885

回答

5

因为你试图再次启动的AsyncTask里面doInBackground时,它仍在运行。改变你的代码,得到它的工作:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash_layout); 
    downloadFAQ = new DownloadFAQ(); 
    new Thread(new Runnable() { 
      public void run() { 
       try { 
        downloadFAQ.execute().get(2000, TimeUnit.MILLISECONDS); 

        SplashActivity.thisrunOnUiThread(new Runnable() { 
         public void run() { 
         // start Activity here 
          Intent i = new Intent(SplashActivity.this, 
                 TabsActivity.class); 
          SplashActivity.this.startActivity(i); 
          SplashActivity.this.finish(); 
         } 
        }); 
       } 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(); 
       } 
      } 
     }).start(); 
} 

,你将需要从doInBackground方法去除downloadFAQ.get(2000, TimeUnit.MILLISECONDS);改变你的AsyncTask作为

private class DownloadFAQ extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     ServerAPI server = new ServerAPI(getApplicationContext()); 
     server.serverRequest(ServerAPI.GET_FAQ, null); 
     return null; 
    } 

    protected void onPostExecute(Void result) { 

    } 

} 
+0

我有转发我的代码,它不起作用。但似乎时间正在计算,当时间到期时,异常被调用。怎么可能看到确切的时间是否在计数? – user1376885

+0

@ user1376885:最好的方法是把日志,而不是线程和asyncTask,并检查控制流向哪里去 –

+1

感谢大家,一切都说你对我非常有用,你的时间是正常工作。就在时间到期时,会出现超时异常WARNING(而不是错误),我写这个异常出现时该怎么做,它的功能就像一个魅力。现在如此,如果请求无法及时传递,那么请取消阻止用户界面 - >重定向到主要活动,但后台请求仍在运行,直到完成。对于最终用户来说,它会很棒,不需要等待一些东西,但是我不知道它会对设备资源造成太大的危害或者不会。 – user1376885

0

考虑使用的AsyncTask状态: AsyncTask.Status

+0

你不了解我的想法。状态只显示运行或不运行,但我需要参考时间,如果执行的HTTP请求太长,则停止asynctask并跳转到主要活动中。不管请求被设法通过或不通过。 – user1376885