我正在使用这个例子:
Android - Setting a Timeout for an AsyncTask?
以下列方式:
al.setOnClickListener(new OnClickListener(){
public void onClick(View w)
{
final AlogLoader loader = new AlogLoader();
loader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
public void run()
{
if(loader.getStatus() == AsyncTask.Status.RUNNING)
{
loader.cancel(true);
}
}
}, 1);
}
});
我将它设置为“1”因为我想看看我是否可以在它开始之前实际停止它 - 看看我的处理程序是否正常工作 - 实际上我可能会将它设置为15000(15秒)。
然而,会发生什么令人困惑:
运行应用程序会导致我的onPreExecute()绘制一个加载屏幕,该屏幕不会退出,因此用户只能看到一个加载屏幕。
在调试器中使用loader.cancel处的断点运行它(true) - >导致调试器停在该行,这是预期的,因为它只允许运行1毫秒。但是,当我在调试器中点击恢复按钮之后 - 我的onPostExecute()被调用... 这怎么可能?
很明显,我很快就会对asynasasks进行计时 - 经过一些研究后,我找到了上面的例子,它似乎对我来说最有意义,当然更多 loader.get(15000,TimeUnit.MILLISECONDS);,因为它会阻止UI线程。
感谢任何帮助...甚至对流程的解释......
答案 0 :(得分:0)
好, 所以我基本上解决了我的问题,但我仍然感到困惑......不知道这是否一切都好。
我不清楚loader.cancel(true)实际上是如何工作的。基于API级别(请阅读此问题:AsyncTask.onCancelled() not being called after cancel(true)),您需要在AsyncTask中使用onCancelled()或onCancelled(params)方法,或两者兼而有之。
我没有这个,所以这就解释了为什么我永远看到了加载屏幕。好的。
然而,它没有解释如何在调试器中,我设法仍然调用onPostExecute(),因为根据Android API,一旦调用cancel(true),onPostExecute永远不会被调用...
答案是: 将此添加到您的AsyncTask -
@Override
protected void onCancelled()
{
Toast.makeText(FriendsActivity.this,"Blah- reason", Toast.LENGTH_LONG).show();
loadingScreen.dismiss();
}