为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号