我最近需要在我的Android应用程序中的一个活动中使用AsyncTask。所以我在活动中创建了一个类,并在该类中扩展了AsyncTask。
但是现在,每当我启动该特定活动时,我的应用程序立即崩溃。我尝试将整个onCreate()
活动放在try,catch块中,但没有引发异常。当我启动该活动时,应用程序立即崩溃,而LogCat中没有任何解释。
在我添加上面提到的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;
}
}
修改 我在LogCat中发现了一个看起来很重要的错误:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.exampleapp/com.example.exampleapp.ListViewA}: java.lang.NullPointerException
答案 0 :(得分:0)
我的程序中有一个private class ReadFilesTask extends AsyncTask<String, Void, String>
。
在此之下,我有:protected void onPreExecute()
,
protected String doInBackground(String... params)
和
protected Void onPostExecute(String result)
。
前两个在它们之上@Override
。我实际上唯一使用的是doInBackground
。我首先要尝试将@Override
添加到doInBackground()
。接下来,尝试将Context
更改为String
。
编辑:
您也缺少获取活动的功能。同样,这正是我在我的代码中所做的以及我在网上看到的一些例子:
public RetreiveFeedTask(Activity activity) {
this.activity = activity;
}
类似的东西。
答案 1 :(得分:0)
您的编辑很有趣,并且表明Activity的实例化存在问题,在这种情况下,我会非常仔细地查看变量声明。但是,如果没有任何代码(或更多onCreate
代码),或者来自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;
}
}
辅助点是您的top()
函数,它返回er
。我猜你希望它等到AsyncTask完成后再返回er
,这是由AsyncTask计算的。但是,它目前要做的是设置AsyncTask,然后立即返回er
:它不会等待AsyncTask完成。
要实现这一点,您可能需要将按钮按下操作分为两个阶段:
er
的代码。答案 2 :(得分:0)
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
}
}
...
}