其他线程无法触及Android视图?

时间:2012-11-24 05:40:23

标签: java android multithreading ui-thread

我是Android的新手并为自己创建了一个迷你FTP下载管理器。我正在使用多线程,每个线程处理一次下载或上传。在MainActivity.java中,我在视图中使用了两个微调器。一个列出服务器上的文件(可以下载),另一个列出我手机文件夹上的文件(可以上传)。我想在上传新文件时更新第一个(下载)微调器,在下载新文件时更新第二个(上传)微调器。但是,只有当相应的线程完成其工作时,我才能知道如何更新微调器。我创建了更新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);
}

为什么不能从另一个线程调用这个方法,而另外一个方法是什么,我只是想更新微调器,但我只花了一整天这个...

2 个答案:

答案 0 :(得分:1)

对于将更新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()方法进行处理,然后更新Spinners

onPostExecute()方法中的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
  6. thenewboston.org的第5个链接在YouTube上有大约200多个视频教程:http://www.youtube.com/course?list=EC2F07DBCDCC01493A&feature=plcp

    编辑2:点击此链接中的编辑https://stackoverflow.com/a/13265776/450534

    这是答案的最底层。

答案 1 :(得分:0)

任何与视图有关的操作都应该在UI线程上完成。 您可以使用activityInstance.runOnUIThread()来处理从不同线程更新视图的这种情况。

参考:Android: RunOnUiThread vs AsyncTask