如何使用 Android 网络访问、线程和处理程序

How to use Android network access, threads and handlers

尝试编写我的第一个 Android 应用程序,我的出发点是让应用程序从我的网站读取文本文件,并将其显示在应用程序中。

我已授予应用程序网络访问权限,发现无法从主线程进行网络访问,但还发现单独的线程无法对 TextView 进行更改。试图实现处理程序,但一切都崩溃了。

我使用了一个由按钮触发的全局变量,这样主线程可以更新 TextView,但是当我将计时器添加到 运行 同一个线程时,TextView 变成空白或崩溃。

你能概述一下推荐的 steps/code 吗,因为我正在努力将所有组件放在一起以启动我吗?

更新:这是我放在一起的工作代码:

private class GetUpdate extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params){
        try {
            URL urlObj = new URL("https://webpage.com");
            HttpsURLConnection urlConnection = (HttpsURLConnection) urlObj.openConnection();
            urlConnection.setConnectTimeout(5000);
            InputStream is = urlConnection.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

            String temp = br.readLine();
            UpdateInfo = UpdateInfo + br.readLine();
        }
        catch (java.net.SocketTimeoutException e) {
            UpdateInfo = UpdateInfo + "No Network";
        }
        catch (IOException e){
            UpdateInfo = UpdateInfo + "Failed";
            throw new RuntimeException(e);
        }
        return "";
    }

    protected void onPostExecute(String result) {
        TextView StatusText = (TextView) findViewById(R.id.StatusText);
        StatusText.setText(UpdateInfo);
    }

    @Override
    protected void onPreExecute() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        String currentDateandTime = sdf.format(new Date());
        UpdateInfo = "Status -\n\r" + currentDateandTime + " - ";
    }

    @Override
    protected void onProgressUpdate(Void... values) {}
    }

定时器位于 onCreate 中:

    Timer myTimer = new Timer();
    myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            new GetUpdate().execute("");
        }
    }, 0, 5000);

这是一个例子:-

在您的 oncreate 方法上执行此操作

txtMessage = (TextView) findViewById(R.id.txt_push_message);

new task().execute();

 class task extends AsyncTask<String, String,String>{

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        txtMessage.setText("Hi there");
    }

    @Override
    protected String doInBackground(String... params) {

        //Do something related to get the data and return that
        //Return the proper value
        return null;
    }
}