Java 在微调器小部件(Android Studio)中选择项目时没有响应
下面的代码从xml页面检索数据,并将数据存储在名为NameList的ArrayList中。名称列表中的元素被指定显示在微调器下拉列表中。我的问题是,每当我在微调器中选择一个项目时,控制台上都不会显示任何内容。假设显示一条消息,如代码中所示,同时显示此错误消息:Java 在微调器小部件(Android Studio)中选择项目时没有响应,java,android,android-studio,spinner,Java,Android,Android Studio,Spinner,下面的代码从xml页面检索数据,并将数据存储在名为NameList的ArrayList中。名称列表中的元素被指定显示在微调器下拉列表中。我的问题是,每当我在微调器中选择一个项目时,控制台上都不会显示任何内容。假设显示一条消息,如代码中所示,同时显示此错误消息: Attempted to finish an input event but the input event receiver has already been disposed. 显示。有人知道我如何解决这个问题吗
Attempted to finish an input event but the input event receiver has already
been disposed.
显示。有人知道我如何解决这个问题吗
boolean done = false;
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
try
{
URL url = new URL("http://www.xmlWebsite.ca");
URLConnection urlConnection = url.openConnection();
input = new BufferedInputStream(urlConnection.getInputStream());
//....................................
namesList.add(name);
done=true;
}
}
catch (IOException e1)
{
System.out.println("The URL is not valid.");
System.out.println(e1.getMessage());
}
catch (XmlPullParserException e)
{
System.out.println("xml error");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
thread.start();
while (done == false)
{
try
{
Thread.sleep(1500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, namesList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
Toast.makeText(getBaseContext(), parent.getItemAtPosition(position) + " selected", Toast.LENGTH_LONG).show();
System.out.println(parent.getItemAtPosition(position) + " selected!!!!!!!!!!!!!!!!!!");
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
});
}
我添加了一个while循环以等待线程完成。我不确定这是否是最有效的方法。你知道吗-
在它的doInBackground方法中执行网络操作,在onPostExecute方法中执行适配器和操作侦听器。这是最好的处理方法
这样做,您不需要创建单独的线程并使用循环来等待网络操作完成。您还可以在从XML文件获取数据的过程中显示“进度”对话框。令人惊讶的是,您可以在微调器中看到项目,因为此代码存在并发问题。您正在运行一个线程,该线程获取名称,将它们放入名称列表,而微调器不会等到它完成。微调器中的名称来自何处?我从从从xml网页检索的名称列表arraylist中获取名称。是的,我在这里看到了一个并发问题,也许这就是我收到错误消息的原因。我更新了代码。我添加了一个等待线程完成的while循环。我不确定这是否是最有效的方法。检查名称列表是否为空,并使用asynctask而不是线程