0

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

我在 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 Execute,如果我注释掉我的应用程序运行的 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 没有显示任何编码错误。我是否正确地创建和处理这些变量?

4

2 回答 2

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);
于 2012-10-18T16:34:58.803 回答
0

如果这是与您的主要活动不同的课程,那么您正试图从哪里找到ViewById?您可能会在 onPostExecute 的第一行得到 NullPointerException,即:

cls2.updateSpinner(schoolNames);

因为你试图在这个方法中找到一个视图。但是您没有任何包含您要查找的视图的父视图。

所以我建议你把这个 fetchSchools 类作为你的 mainActivity 的私有内部类。因此您将能够在全局范围内找到这些视图并根据需要进行设置。

于 2012-10-18T18:06:31.430 回答