gpt4 book ai didi

java - Android View 不能被其他线程触及?

转载 作者:行者123 更新时间:2023-11-30 03:54:41 25 4
gpt4 key购买 nike

我是 Android 的新手,正在为自己创建一个迷你 FTP 下载管理器。我正在使用多线程,每个线程处理一个下载或上传。在 MainActivity.java 中,我在 View 中使用了两个微调器。一个列出服务器上的文件(可以下载),另一个列出我手机文件夹中的文件(可以上传)。我想在上传新文件时更新第一个(下载)微调器,在下载新文件时更新第二个(上传)微调器。但是,我无法弄清楚如何仅在相应线程完成工作时更新微调器。我在 MainActivity.java 中创建了更新微调器的方法,并尝试在线程的 run() 结束时调用它们,以便在线程完成下载/上传后更新它们。但是,我在 LogCat 中收到一条错误消息

android.view.ViewRoot$CalledFromWrongThreadException :只有创建 View 层次结构的原始线程才能触及它的 View 。

更新上传微调器的方法是:

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);
}

为什么不能从另一个线程调用此方法,另一种方法是什么,我只是想更新微调器,但我在这唯一的事情上花了一整天...

最佳答案

对于任何将更新 UI 的代码,将其放在此 block 中:

有关 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() 方法中进行处理,然后在 AsyncTask< 的 onPostExecute() 方法中更新 Spinners/

编辑:查看这些教程以帮助您开始使用 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

它在答案的底部。

关于java - Android View 不能被其他线程触及?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com