我需要我的 ArrayAdapter 將加載來自 HTTP 請求的數據。我的 onCreate 方法:private Spinner spiCities;private ArrayAdapter<String> citiesAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread() { @Override public void run() { LoadCities lc = new LoadCities(); lc.execute(); } }.start();}我在 Activity 中有一個內部類:class LoadCities extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { BufferedReader br = null; try { URL url = new URL("http://10.0.2.2/inter/api/loadCities.php"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); if ( con.getResponseCode() != 200 ) { throw new RuntimeException( "Error: " + con.getResponseMessage() ); } br = new BufferedReader( new InputStreamReader( con.getInputStream() ) ); } catch ( MalformedURLException e ) { e.printStackTrace(); } catch ( IOException e ) { e.printStackTrace(); } if ( null == br ) { return "[]"; } else { StringBuilder sb = new StringBuilder(); try { String linha; while ( (linha = br.readLine()) != null ) { sb.append( linha ); } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } } @Override protected void onPostExecute(String s) { super.onPostExecute(s); s = s.substring(1); s = s.substring(0, s.length()-1); List<String> listCities = new ArrayList<>(); String s1; for ( String aux : s.split(",") ) { s1 = aux.substring(1); s1 = s1.substring(0, s1.length()-1); listaCidades.add(s1); }
1 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
你在 AsyncTask 中實例化了itiesAdapter,它在后臺運行,也就是說,你永遠不知道它什么時候開始運行或結束。如果您嘗試在 Activity 中的其他任何地方訪問變量 cityAdapter,那么itiesAdapter 可能已經實例化,也可能尚未實例化。因此,您可以在 onPostExecute 方法中執行與 cityAdapter 相關的所有內容,或者等待變量被實例化后再嘗試使用它。
如果您確實需要等待 onPostExecute 完成才能在您的 Activity 中執行其他內容,那么您應該實現onProgressUpdate以通知用戶您的 Activity 正在加載某些內容。
你根本不需要做一件事。您正在創建一個線程,然后在其中運行 AsyncTask。這是完全沒有必要的,因為 AsyncTask 已經為您創建了一個線程,這就是它存在的原因。所以,不要使用“new Thread()”。
添加回答
舉報
0/150
提交
取消