2

私は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日だけに費やしました...

4

2 に答える 2

2

UIを更新するコードについては、次のブロックに配置します。

runOnUiThreadの詳細については、このリンクを参照してください

runOnUiThread(new Runnable() {
     public void run() {

         // RUN THE CODE WHICH IS GIVING THAT EXCEPTION HERE

    }
});

同じことも次のように行うことができます:

Runnable run = new Runnable() {

    @Override
    public void run() {

        // RUN THE CODE WHICH IS GIVING THAT EXCEPTION HERE

    }
}; YourActivity.this.runOnUiThread(run);

または、 AsyncTaskを利用することもできます。メソッドで処理を行ってから、のメソッドdoInBackground()でを更新できます。SpinnersonPostExecute()AsyncTask

編集:これらのチュートリアルをチェックして、AsyncTaskの使用を開始するのに役立ててください。

  1. http://www.vogella.com/articles/AndroidPerformance/article.html#asynctask
  2. http://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/
  3. http://android10.org/index.php/articlesother/239-android-application-and-asynctask-basics
  4. http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/
  5. http://thenewboston.org/watch.php?cat=6&number=101

thenewboston.orgへの5番目のリンクには、YouTubeに約200の奇妙なビデオチュートリアルがあります:http ://www.youtube.com/course?list = EC2F07DBCDCC01493A&feature = plcp

編集2:ここでこのリンクの編集を確認してください: https ://stackoverflow.com/a/13265776/450534

それは答えの一番下にあります。

于 2012-11-24T05:58:11.217 に答える
1

ビューに関係することはすべて、UIスレッドで実行する必要があります。activityInstance.runOnUIThread()を使用して、異なるスレッドからビューを更新するこのシナリオを処理できます。

参照:Android:RunOnUiThread vs AsyncTask

于 2012-11-24T05:48:09.390 に答える