Android中带有HTTPRequest的线程

我需要我的 ArrayAdapter 将加载来自 HTTP 请求的数据。


我的 onCreate 方法:


private Spinner spiCities;

private ArrayAdapter<String> citiesAdapter;


@Override

protected 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);

        }


小唯快跑啊
浏览 199回答 1
1回答

智慧大石

你在 AsyncTask 中实例化了itiesAdapter,它在后台运行,也就是说,你永远不知道它什么时候开始运行或结束。如果您尝试在 Activity 中的其他任何地方访问变量 cityAdapter,那么itiesAdapter 可能已经实例化,也可能尚未实例化。因此,您可以在 onPostExecute 方法中执行与 cityAdapter 相关的所有内容,或者等待变量被实例化后再尝试使用它。如果您确实需要等待 onPostExecute 完成才能在您的 Activity 中执行其他内容,那么您应该实现onProgressUpdate以通知用户您的 Activity 正在加载某些内容。你根本不需要做一件事。您正在创建一个线程,然后在其中运行 AsyncTask。这是完全没有必要的,因为 AsyncTask 已经为您创建了一个线程,这就是它存在的原因。所以,不要使用“new Thread()”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java