Не удается получить HTML-код через AsyncTask & inputStreamReader - PullRequest
0 голосов
/ 14 мая 2019

Доброе утро!Я пытаюсь получить HTML-код из URL-адреса, используя AsyncTask & inputStreamReader.Поскольку эта работа создает исключение, я использовал try & catch, но ни ry, ни подвох не происходит.

    public void click (View v){
        Tasking task = new Tasking();
        task.execute();
    }

(я убедился, что моя кнопка подключена к коду)

    class Tasking extends AsyncTask<Integer, Integer, String>{
        @Override
        protected String doInBackground(Integer... integers) {
            InputStream inputStream;
            InputStreamReader inputStreamReader;
            char c = ' ';
            String s = "";
            URL u;

            try{
                u = new URL("https://www.google.com/");
            inputStream = u.openConnection().getInputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            do{
                c = (char) inputStreamReader.read();
                s += c;
            }while(c !=-1);

            }catch (Exception e){
                e.printStackTrace();
                return "Failed";
            }
            return "?!";
        }

        @Override
        protected void onPostExecute(String s) {
            TextView textView = (TextView) findViewById(R.id.textView);
            textView.setText(s);
            super.onPostExecute(s);
        }
    }

IMG Вы можете видеть на картинке, что даже после нажатия ничего не изменилось, и я получаю это сообщение:

D/NetworkSecurityConfig: No Network Security Config specified, using platform default
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
    (HTTPLog)-Static: isSBSettingEnabled false
I/zygote64: Do partial code cache collection, code=61KB, data=40KB
I/zygote64: After code cache collection, code=61KB, data=40KB
    Increasing code cache capacity to 256KB
I/zygote64: Background concurrent copying GC freed 392(31KB) AllocSpace objects, 390(13MB) LOS objects, 50% free, 10MB/20MB, paused 6.137ms total 27.526ms

Заранее спасибо!

1 Ответ

1 голос
/ 14 мая 2019
do{
   c = (char) inputStreamReader.read();
   s += c;
}while(c !=-1);

Это идет как бесконечный цикл, потому что c никогда не равно -1.И для лучшей практики вы должны определить свои виджеты UI, такие как TextView, Button onCreate в Activity-onCreateView in Fragments.

Таким образом, вы можете использовать StringWriter и BufferedReader для своих целей.Это полный код вашего вопроса.

public class MainActivity extends AppCompatActivity {

public static final String LOG_TAG = MainActivity.class.getSimpleName();
private TextView resultTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    resultTextView = findViewById(R.id.textView);
    new Tasking().execute();
}

class Tasking extends AsyncTask<Integer, Integer, String> {
    @Override
    protected String doInBackground(Integer... integers) {
        StringWriter sw = new StringWriter();
        try {
            URL url = new URL("https://www.google.com/");
            InputStream inputStream = url.openConnection().getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader br = new BufferedReader(inputStreamReader);
            char[] buffer = new char[1024 * 16];
            int readLength;
            while (-1 != (readLength = br.read(buffer))) {
                sw.write(buffer, 0, readLength);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "Failed";
        }
        return sw.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        Log.v(LOG_TAG, "Response:" + s);
        resultTextView.setText(s);
    }
}

}

Наконец, вы должны записать свой ответ или отладить весь класс.Это то, что делают профессиональные разработчики.Так что чем больше кода, тем больше счастья.Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...