私はAndroidの初心者で、自分用のミニFTPダウンロードマネージャーを作成しています。マルチスレッドを使用しており、各スレッドが1つのダウンロードまたはアップロードを処理します。MainActivity.javaでは、ビューで2つのスピナーを使用しています。1つはサーバー上のファイル(ダウンロード可能)を一覧表示するためのもので、もう1つは私の電話フォルダー(アップロード可能)上のファイルを一覧表示するためのものです。新しいファイルがアップロードされたときに最初の(ダウンロード)スピナーを更新し、新しいファイルがダウンロードされたときに2番目の(アップロード)スピナーを更新したいと思います。ただし、対応するスレッドがジョブを終了したときにのみスピナーを更新する方法を理解することはできません。MainActivity.javaでスピナーを更新するメソッドを作成し、スレッドのrun()の最後でそれらを呼び出そうとしたので、スレッドのダウンロード/アップロードが完了すると更新されます。ただし、LogCatで次のようなエラーが発生します
android.view.ViewRoot $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。
アップロードスピナーを更新する方法は次のとおりです。
void upScrollUpdate() {
spinup=(Spinner)findViewById(R.id.uploadspin);
spinup.setEnabled(false);
String[] upload={"No Files"};
File sdDir=Environment.getExternalStorageDirectory();
File dir=new File (sdDir.getAbsolutePath() + "/aFTP");
File[] fArray=dir.listFiles();
if(fArray.length>0) {
upload=new String[fArray.length];
}
for(int i=0;i<fArray.length;i++) {
upload[i]=fArray[i].getName();
}
ArrayAdapter<String> saaUpload=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,upload);
spinup.setAdapter(saaUpload);
if(spinup.getSelectedItem().toString().equalsIgnoreCase("No Files")) {
uploadButton.setEnabled(false);
}
spinup.setEnabled(true);
}
このメソッドを別のスレッドから呼び出すことができないのはなぜですか。また、これとは別の方法として、スピナーを更新したいのですが、この1日だけに費やしました...