【问题标题】:Android Why does my app Force to close?Android 为什么我的应用程序强制关闭?
【发布时间】:2010-11-19 06:26:54
【问题描述】:

我承认,我在整个 Android 方面都是新手。我正在尝试制作一个应用程序,但随机出现强制关闭错误,我真的不知道为什么。我的应用程序有很多活动,当我开始一个新的活动时,它们都没有完成()。我从 Web 获取数据(通过 Web 服务和直接图像下载)并且我经常使用 AsyncTask。大多数时候它在异步任务上崩溃。这是我如何做事的示例:

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,但我认为在这里我错过了一些东西。正如我之前所说,即使我在另一个活动中,我也会随机关闭。这真的很令人沮丧,因为我无法提供具有这种行为的应用程序。那么,我做错了什么?

【问题讨论】:

  • 如果有 FC,您应该检查日志(来自 sdk/tools 目录的命令行中的“adb shell logcat”;或在 Eclipse DDMS 视图中)。然后在此处粘贴错误日志。
  • 我检查了日志并且可变的是异步任务中的空指针异常......问题是当我收到消息时我正在进行另一个活动。

标签: android android-asynctask


【解决方案1】:

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

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

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

【讨论】:

  • 我从来没有使用过执行(这个)。奇怪的是,无论是否请求,我都没有找到任何信息。您能否详细说明为什么有必要?谢谢。
  • 阿林,没必要。您已将 Context 定义为第一个参数“extends AsyncTask”,因此您需要传递它。如果您不需要传递任何东西,那么将“Void”作为第一个参数放在那里
  • 我现在明白了,好点子。有趣的是它的工作原理。如果出现问题,try catch 会发生什么?它是否将 null 返回到 onPostExecute ?
【解决方案2】:

您需要在 AsyncTask 班级内询问 isCancelled(),然后决定要做什么。

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

您可以停止 AsyncTask。如果你打电话 取消(真),中断将是 发送到后台线程,其中 可能有助于可中断的任务。 否则,您只需确保 定期检查 isCancelled() 你的 doInBackground() 方法。你可以 请参阅此处的示例 code.google.com/p/shelves.

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多