我的应用程序崩溃了。我做错了什么?
我在类fetchsSchools中使用AsyncTask。
public class fetchSchools extends AsyncTask<Void, Void, ArrayList<String>>{
@Override
protected ArrayList<String> doInBackground(Void... arg0) {
ArrayList<School> schools = new ArrayList<School>();
ArrayList<String> schoolNames = new ArrayList<String>();
... code omitted for conciseness...
return schoolNames;
}
在这个课程中,我有一个onPost执行,我的代码可以解决这个问题,如果我注意到我的app运行的cls2行:
public void onPostExecute(ArrayList<String> schoolNames) {
MainActivity cls2=new MainActivity();
cls2.updateSpinner(schoolNames);
cls2.switchScreens();
}
上面的内容在MainActivity中触发了这两个问题,导致应用程序崩溃:
public void updateSpinner(ArrayList<String> schoolNames) {
Spinner schoolSpinner = (Spinner)findViewById(R.id.school_spinner);
schoolSpinner.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, schoolNames));
}
public void switchScreens() {
ProgressBar progressBar1 = (ProgressBar)findViewById(R.id.progressBar1);
progressBar1.setVisibility(View.GONE);
TextView loading_label = (TextView)findViewById(R.id.loading_label);
loading_label.setVisibility(View.GONE);
}
Eclipse没有显示任何编码错误。我是否正确地创建并处理这些变量?
答案 0 :(得分:1)
虽然您没有为MainActivity和logcat提供代码。看到您的代码看起来像MainActivity扩展Activity。如果是这样,你就不能打电话了
MainActivity cls2=new MainActivity();
MainActivity必须由android framework
在适当的上下文中初始化。自己调用构造函数不会调用Activity的任何生命周期方法。
因此,使用Context的所有后续调用都将失败,尤其是findViewByid
您需要startActivity
而不是您正在做的事情。
编辑:
在Asynctask中创建一个构造函数,在实例化时传递MainActivity并像下面那样分配并删除new MainActivity
行
public class fetchSchools extends AsyncTask<Void, Void, ArrayList<String>>{
MainActivity cls2;
fetchSchools(MainActivity activity){
cls2 = activity;
}
@Override
protected ArrayList<String> doInBackground(Void... arg0) {
ArrayList<School> schools = new ArrayList<School>();
ArrayList<String> schoolNames = new ArrayList<String>();
... code omitted for conciseness...
return schoolNames;
}
public void onPostExecute(ArrayList<String> schoolNames) {
cls2.updateSpinner(schoolNames);
cls2.switchScreens();
}
}
在MainActivity中,您可以调用
new fetchSchools(mMainActivity).execute(param);
答案 1 :(得分:0)
如果这是您主要活动的单独课程,那么您是否尝试从哪里找到ViewById?你可能会在onPostExecute的第一行得到NullPointerException,这就是这一行:
cls2.updateSpinner(schoolNames);
因为您尝试在此方法中查找视图。但是您没有包含您要查找的视图的任何父视图。
所以我建议你把这个fetchSchools类作为mainActivity的私有内部类。这样你就可以在全局范围内找到这些视图,并根据需要设置它们。