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

时间:2017-08-18 11:34:02

标签: android multithreading network-programming handler

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

我给了应用程序网络访问权限,发现无法从主线程进行网络访问,但是也发现单独的线程无法对TextViews进行更改。试图实施Handler,一切都崩溃了。

我使用了一个由按钮触发的全局变量,因此主线程可以更新TextView,但是当我在混合中添加一个计时器来运行相同的线程时,TextView会出现空白或崩溃。

您是否可以概述推荐的步骤/代码,因为我正在努力将所有组件放在一起让我开始?

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

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

1 个答案:

答案 0 :(得分:1)

这是一个例子: -

在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;
    }
}