我需要我的 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
提交
取消
