亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android中帶有HTTPRequest的線程

Android中帶有HTTPRequest的線程

小唯快跑啊 2022-07-14 10:07:45
我需要我的 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()”。


查看完整回答
反對 回復 2022-07-14
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號