【发布时间】:2015-05-05 13:45:44
【问题描述】:
以下代码从 xml 页面检索数据并将数据存储在名为 namesList 的 ArrayList 中。 namesList 中的元素被分配以显示在微调器下拉列表中。我的问题是,每当我在微调器中选择一个项目时,控制台上都没有显示任何内容。 (假设显示一条消息,如代码所示)偶尔会出现此错误消息:
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 循环来等待线程完成。我不确定这是否是最有效的方法。
【问题讨论】:
-
您可以在微调器中看到项目真是太棒了,因为此代码存在并发问题。您正在运行一个线程来获取名称,将它们放在 namesList 中,而您的微调器不会等到它完成。微调器中的名称来自哪里?
-
我从 xml 网页检索的 namesList 数组列表中获取了名称。是的,我在这里看到了一个并发问题,也许这就是我收到该错误消息的原因。
-
我更新了代码。我添加了一个等待线程完成的while循环。我不确定这是否是最有效的方法。
-
检查名称列表是否为空并使用 asynctask 而不是线程
标签: java android android-studio spinner