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

Android为什么我的应用程序强制关闭?,android,android-asynctask,Android,Android Asynctask,我承认,我对安卓这个东西还不熟悉。我正在尝试制作一个应用程序,但随机出现强制关闭错误,我真的不知道为什么。我的应用程序有许多活动,当我启动一个新的活动时,没有一个活动完成()。我从网络上获取数据(通过网络服务和直接图像下载),并且经常使用AsyncTask。大多数情况下,它在异步任务上崩溃。以下是我如何做事的示例: private BackTask backTask; Activity ctx = this; public void onCreate(Bundle savedInsta

我承认,我对安卓这个东西还不熟悉。我正在尝试制作一个应用程序,但随机出现强制关闭错误,我真的不知道为什么。我的应用程序有许多活动,当我启动一个新的活动时,没有一个活动完成()。我从网络上获取数据(通过网络服务和直接图像下载),并且经常使用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);
 }
私有BackTask BackTask;
活动ctx=此;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.trackslist);
backTask=新的backTask();
backTask.execute();
}
受保护的类BackTask扩展了AsyncTask
{
@凌驾
受保护的myObject doInBackground(上下文…参数)
{
试一试{
如果(hasInternet(ctx)=真)
{
//在此处访问web服务
//使用来自web的结果初始化myObject
返回对象
}
其他的
{
返回空
}
}捕获(例外情况除外){
返回null;
}
}
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(字符串…值)
{
super.onProgressUpdate(值);
}
@凌驾
受保护的void onCancelled()
{
super.onCancelled();
}
@凌驾
PostExecute上受保护的void(myObject结果)
{
super.onPostExecute(结果);
if(result==null | | result.isEmpty())
{
//没有有效结果,显示一条消息
}
其他的
{
//你能用它做点什么吗
}
}
}
@凌驾
公共无效暂停()
{
if(backTask!=null&&!backTask.isCancelled())
{
backTask.cancel(true);
}
super.onPause();
}
public void btnStartOnClick(查看目标){
Intent Intent=newintent(这个,MyNewActivity.class);
星触觉(意向);
}

当活动进入暂停()时,任务将被取消。我不确定在try/catch过程中会发生什么,如果出现错误,根据我所做的,它应该返回null,但是我想我错过了一些东西。正如我之前所说,即使我在进行另一项活动,我也会随机得到一个力接近。这真是令人沮丧,因为我不能提供一个有这种行为的应用程序。那么,我做错了什么

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

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

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

您需要在
AsyncTask
类中询问
isCancelled()
,然后决定做什么

检查。罗曼·盖伊对此有很好的解释:

您可以停止异步任务。如果你打电话 取消(true),将显示一个中断 发送到后台线程,其中 可能有助于中断任务。 否则,您只需确保 在中定期检查isCancelled() 您的doInBackground()方法。你可以 请参见下面的示例: code.google.com/p/shelfs


如果有FC,您应该检查日志(“sdk/tools目录中命令行中的adb shell logcat;或Eclipse DDMS视图中的”)。然后将错误日志粘贴到这里。我检查了日志,发现asynctask中存在空指针异常。。。问题是,当我收到消息时,我正在进行另一项活动。我从未使用过执行(这个)。奇怪的是,我没有设法找到任何信息,如果它的要求与否。请你详细说明一下为什么有必要?谢谢。阿林,没必要。您已经将上下文定义为第一个参数“extends AsyncTask”,所以需要传递它。若你们不需要通过任何考试,那个么就把第一个parameteri现在理解的“Void”放在那个里,好的观点。有趣的是,它的工作原理是这样的。如果出现问题,试一试会发生什么?它是否将null返回到onPostExecute?