定义和设置元素属性时,Android应用程序崩溃

时间:2012-10-18 16:02:51

标签: android android-asynctask

我的应用程序崩溃了。我做错了什么?

我在类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没有显示任何编码错误。我是否正确地创建并处理这些变量?

2 个答案:

答案 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的私有内部类。这样你就可以在全局范围内找到这些视图,并根据需要设置它们。