2013-03-24 58 views
0

我使用这个例子停止问题:苦苦寻找与原因的AsyncTask没有被处理程序

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()被调用... 这怎么可能?

很显然,我很新的超时asynctasks - 经过一番研究,我发现上面的例子中,它似乎最有意义给我,肯定更然后 loader.get(15000,TimeUnit.MILLISECONDS ),因为那阻止了UI线程。

任何帮助表示赞赏...甚至在处理的说明..

回答

0

好吧, 所以我基本上解决了我的问题,但我仍然困惑...不知道如果这一切都很好。

我不清楚loader.cancel(true)是如何工作的。根据API级别(阅读此问题:AsyncTask.onCancelled() not being called after cancel(true)),您需要在AsyncTask中具有onCancelled()或onCancelled(params)方法或两者。

我没有这个,所以这解释了为什么我永远看到加载屏幕。好的。

然而,它并没有解释如何在调试器中,我设法仍然调用onPostExecute(),因为根据Android的API的,onPostExecute不会被调用一次取消(真)被称为...

答案是: 添加到您的AsyncTask-

@Override 
    protected void onCancelled() 
    { 
     Toast.makeText(FriendsActivity.this,"Blah- reason", Toast.LENGTH_LONG).show(); 
     loadingScreen.dismiss(); 
    }