我是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的任何代码,请将其放在此块中:
请引用此链接以获取有关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:
指向thenewboston.org的第5个链接在YouTube上有大约200个奇怪的视频教程,位于:http://www.youtube.com/course?list=EC2F07DBCDCC01493A&feature=plcp
编辑2:在此处检查此链接中的编辑:https://stackoverflow.com/a/13265776/450534
这是答案的底部。