Java 将AsyncTask类添加到活动崩溃应用程序
我最近需要在android应用程序的活动中使用AsyncTask。因此,我在活动中创建了一个类,并在该类中扩展了AsyncTask 但现在,每当我启动那个特定的活动,我的应用程序都会立即崩溃。我尝试将活动的整个Java 将AsyncTask类添加到活动崩溃应用程序,java,android,android-asynctask,Java,Android,Android Asynctask,我最近需要在android应用程序的活动中使用AsyncTask。因此,我在活动中创建了一个类,并在该类中扩展了AsyncTask 但现在,每当我启动那个特定的活动,我的应用程序都会立即崩溃。我尝试将活动的整个onCreate()放在一个try,catch块中,但没有引发异常。当我启动该活动时,应用程序立即崩溃,日志中没有任何解释 这是在我添加了上面提到的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完成
为此,您可能需要将按钮按下操作分为两个阶段:
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
}
}
...
}