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でこれらの2つのoutineを起動します。

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 に答える