Java 将AsyncTask类添加到活动崩溃应用程序

Java 将AsyncTask类添加到活动崩溃应用程序,java,android,android-asynctask,Java,Android,Android Asynctask,我最近需要在android应用程序的活动中使用AsyncTask。因此,我在活动中创建了一个类,并在该类中扩展了AsyncTask 但现在,每当我启动那个特定的活动,我的应用程序都会立即崩溃。我尝试将活动的整个onCreate()放在一个try,catch块中,但没有引发异常。当我启动该活动时,应用程序立即崩溃,日志中没有任何解释 这是在我添加了上面提到的AsyncTask类之后开始的。此外,AsyncTask部分在启动活动时不执行,而是在按下按钮时执行。出了什么问题?我在下面添加了相关代码:

我最近需要在android应用程序的活动中使用AsyncTask。因此,我在活动中创建了一个类,并在该类中扩展了AsyncTask

但现在,每当我启动那个特定的活动,我的应用程序都会立即崩溃。我尝试将活动的整个
onCreate()
放在一个try,catch块中,但没有引发异常。当我启动该活动时,应用程序立即崩溃,日志中没有任何解释

这是在我添加了上面提到的AsyncTask类之后开始的。此外,AsyncTask部分在启动活动时不执行,而是在按下按钮时执行。出了什么问题?我在下面添加了相关代码:

public class ListViewA extends Activity{

    public void onCreate(Bundle savedInstanceState) {try{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv= (ListView)findViewById(R.id.listview);
        //computation
    }

    private String[] top() {
        new RetreiveFeedTask().execute(ctr,ctz);
        return er;
    }

    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
        String[] q;

        protected String[] doInBackground(Context... params) {
            //computation
        }

        protected void onPostExecute() {
            er=q;
            gff=true;
        }
    }

我的程序中有一个
私有类ReadFilesTask扩展了AsyncTask

在此情况下,我有:
受保护的void onPreExecute()

受保护的字符串doInBackground(字符串…参数)
,和
受保护的Void onPostExecute(字符串结果)

前两个有
@覆盖
。不过,我唯一实际使用的是
doInBackground
。我首先要尝试将
@Override
添加到
doInBackground()
。接下来,尝试将
上下文
更改为
字符串


编辑:
您还缺少获取活动的函数。同样,这就是我在代码中所做的,以及我在网上看到的一些示例:

}


诸如此类。

您的编辑很有趣,它表明活动的实例化中存在问题,在这种情况下,我会非常仔细地查看变量声明。但是,如果没有任何代码(或更多的
onCreate
code)或logcat中的周围行,就很难更加具体

正如@Raghunandan所说,你的AsynTask的构造方式是不正确的,它应该是这样的:

public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
    String[] q;

    @Override
    protected String[] doInBackground(Context... params) {
        //computation
        return result; // result is of type String[]
    }

    protected void onPostExecute(String[] result) {
        // do something with result ...
        er=q;
        gff=true;
    }
}
公共类RetreiveFeedTask扩展了AsyncTask{
字符串[]q;
@凌驾
受保护字符串[]doInBackground(上下文…参数){
//计算
返回结果;//结果的类型为String[]
}
受保护的void onPostExecute(字符串[]结果){
//做一些有结果的事情。。。
er=q;
gff=真;
}
}
第二点是
top()
函数,它返回
er
。我猜您希望它等待AsyncTask完成,然后返回由AsyncTask计算的
er
。但是,它目前要做的是设置AsyncTask,然后立即返回
er
:它不会等待AsyncTask完成

为此,您可能需要将按钮按下操作分为两个阶段:

  • 创建并运行异步任务
  • AsyncTask中的OnPostExecute调用当前使用top返回的
    er
    的代码
  • 公共类ListViewA扩展活动{
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ListView lv=(ListView)findViewById(R.id.ListView);
    //计算
    新建RetreiveFeedTask().execute(ctr、ctz);
    }
    ...
    公共类RetreiveFeedTask扩展了AsyncTask{
    @凌驾
    受保护的字符串[]doInBackground(上下文…文件名){
    //计算
    字符串[]q;
    //知道fileName是一个数组
    返回q
    }
    受保护的void onPostExecute(字符串[]结果){
    //对结果做点什么
    }
    }
    ...
    }
    
    您的doInBackground()参数错误。其次,向onPostExecute(结果)添加一个覆盖标记。doInbackground()的结果是onPostExecute的参数。onpostExecute没有任何参数。第三次调用super.onPostExecute(结果);请检查链接@日志cat的任何一侧是否有任何提示,表明NPE在代码中的何处发生?查看该错误,它很可能位于活动的声明部分,可能是发布该消息的一个想法。@NeilTownsend是的,您是对的。错误出现在第
    Context ctz=getApplicationContext()行的声明部分。从本视频中可以看出,您不应该将asynctask用作内部类。每次用户旋转屏幕时都会导致内存泄漏。但我将上下文作为参数传递给AsyncTask。
    Context
    应该可以工作。我只是说,以防万一传递
    上下文会引起问题。首先要真正尝试的主要事情是添加
    @Override
    ,因为在活动启动时无法访问AsyncTask代码,问题不应该存在于其他地方吗?@vergilcorleone问题可能存在于其他地方,但我已经试着指出您发布的代码中的潜在问题。最好在创建时发布更多的
    onCreate
    ,看看是否可以在那里发现任何东西…@vergilcorleone加载异步任务并不重要,除非它是从主UI线程加载的。它应该加载到ui线程上 public RetreiveFeedTask(Activity activity) {

    this.activity = activity;
    
    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
        String[] q;
    
        @Override
        protected String[] doInBackground(Context... params) {
            //computation
            return result; // result is of type String[]
        }
    
        protected void onPostExecute(String[] result) {
            // do something with result ...
            er=q;
            gff=true;
        }
    }
    
    public class ListViewA extends Activity{
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ListView lv= (ListView)findViewById(R.id.listview);
            //computation
    
            new RetreiveFeedTask().execute(ctr,ctz);
        }
        ...
    
        public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]>{
    
             @Override
             protected String[] doInBackground(Context... fileName) {
                 //computation
                 String[] q;
                 //Know that fileName is an Array
                 return q
             }
    
             protected void onPostExecute(String[] result) {
                 //do something with the result
             }
        }
    ...
    }