Android为什么我的应用程序强制关闭?

问题描述:

我承认,我是全新的Android系统。我试图做一个应用程序,但随机我得到强制关闭错误,我真的不知道为什么。我的应用程序有很多活动,当我开始一个新活动时,他们都没有完成()。我从网上获取数据(通过网络服务和直接图像下载),我使用AsyncTask很多。大多数时候它在asynctask上崩溃。以下是我如何做事的示例:Android为什么我的应用程序强制关闭?

private BackTask backTask; 
Activity ctx = this; 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.trackslist); 

     backTask = new BackTask(); 
      backTask.execute(); 
    } 

    protected class BackTask extends AsyncTask<Context, String, myObject> 
     { 
      @Override 
      protected myObject doInBackground(Context... params) 
      { 
       try{ 
         if (hasInternet(ctx)==true) 
         { 
          //access the web SERVICE here 
         //initialize myObject WITH result FROM the web 
         return myObject 
         } 
         else 
         { 
          return null 
         } 

        }catch(Exception ex){ 
         return null; 
       } 
      } 

      @Override 
      protected void onPreExecute() 
      { 
        super.onPreExecute(); 
      } 

      @Override 
      protected void onProgressUpdate(String... values) 
      { 
        super.onProgressUpdate(values); 
      } 

      @Override 
      protected void onCancelled() 
      { 
        super.onCancelled(); 
      } 

      @Override 
      protected void onPostExecute(myObject result) 
      { 
        super.onPostExecute(result); 
        if (result==null || result.isEmpty()) 
        { 
          //no valid result, show a message 
        } 
        else 
        { 
         //result valid do something with it 
        } 
      } 
     } 

    @Override 
     public void onPause() 
     { 
      if (backTask!=null && ! backTask.isCancelled()) 
      { 
       backTask.cancel(true); 
      } 
      super.onPause(); 
     } 

    public void btnStartOnClick(View target) { 
      Intent intent = new Intent(this, MyNewActivity.class); 
     startActivity(intent); 
} 

当活动获取onPause()时,任务正在被取消。我不确定在try/catch期间发生了什么,如果出现错误,我应该返回null,但我认为在这里我错过了一些东西。正如我之前所说的,即使我在另一个活动中,我也会随机得到一支力量。这真令人沮丧,因为我无法提供具有此行为的应用程序。那么,我做错了什么?

+0

如果有FC,您应该检查日志(从sdk/tools目录下的命令行中的'adb shell logcat';或者在Eclipse DDMS视图中)。然后在这里粘贴错误日志。 – 2010-11-19 06:30:44

+0

我检查了日志,并在asynctask中变化为空指针异常......事情是,当我收到消息时,我正在进行另一项活动。 – Alin 2010-11-19 07:14:29

你要问你的AsyncTask类中为isCancelled(),然后再决定该怎么做。

检查this question。 Romain Guy有一个很好的解释:

你可以停止一个AsyncTask。如果您致电 取消(true),则将中断发送到后台线程 ,其中 可能有助于中断任务。 否则,您应该简单地确保 检查isCancelled()定期在 您的doInBackground()方法。您可以通过 code.google.com/p/shelves查看相关示例。

代码存在问题。我已更正如下:您发现我在调用异步任务时添加了这个。 您的异步任务接受上下文作为参数,并且您没有传递该参数。

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.trackslist); 

    backTask = new BackTask(); 
    backTask.execute(this); 
} 
+0

我从来没有使用execute(this)。奇怪的是,我没有设法找到任何信息,如果它的要求或不。你能否详细说明为什么它是必要的?谢谢。 – Alin 2010-11-19 07:21:32

+0

阿林,它没有必要。你已经将Context定义为第一个参数“extends AsyncTask ”,所以你需要传递它。如果你不需要通过任何东西,那么把第一个参数“Void”作为 – 2010-11-19 07:32:52

+0

现在我明白了,好点。有趣的是,它的工作原理就是如此。如果出现问题,尝试抓住会发生什么?它是否返回null到onPostExecute? – Alin 2010-11-19 07:43:11