2015-05-05 99 views
0

下面的代碼從xml頁面檢索數據並將數據存儲在名爲namesList的ArrayList中。 namesList中的元素被分配爲顯示在微調器下拉列表中。我的問題是,只要我在微調器中選擇一個項目,控制檯上就沒有任何東西顯示出來。 (這是假設顯示一條消息,如代碼所示)曾經有一段時間此錯誤消息:Spinner Widget中的選定項目時沒有響應(Android Studio)

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循環來等待線程完成。我不確定這是否是最有效的方式。

+0

令人驚訝的是,您可以看到微調器中的項目,因爲此代碼存在併發問題。你正在運行一個提取名字的線程,把它們放在namesList中,而你的微調不等到它完成。 Spinner的名字來自哪裏? – inmyth

+0

我從namesList arraylist中獲取了從xml網頁中檢索的名稱。雅,我在這裏看到一個併發問題,也許這就是我得到這個錯誤信息的原因。 –

+0

你解決了嗎? –

回答

0

您是否知道AsyncTask? :-)

做你的網絡行動doInBackground的方法就可以了,做適配器和動作監聽工作onPostExecute方法。這是處理這件事的最好方式。

這樣做,您不需要創建單獨的線程並使用循環等待網絡操作完成。在從XML文件獲取數據時,您也可以顯示進度對話框。