AsyncTask не завершает sh загрузку до конца - PullRequest
0 голосов
/ 06 января 2020

Итак, я создаю приложение, которое берет некоторый код HTML с сайта и возвращает некоторые данные обратно, но проблема в том, что AsyncTask, который я использую onCreate, не загружает весь код HTML просто отчасти так, как будто в какой-то момент происходит сбой, я довольно долго искал и пробовал множество решений, но ни одно из них не работает.

Единственные «ошибки», которые я получаю, - это слишком много работы над основной поток, но, насколько я понимаю, AsyncTask должен выполняться в фоновом режиме в другом потоке.

Вот класс AsyncTask:

public class SiteInfo extends AsyncTask<String, Void, String> {


    @Override
    protected String doInBackground(String... urls) {
        URL url;
        String result;
        InputStream inputStream;
        BufferedReader bufferedReader;

        try {

            url = new URL(urls[0]);
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream = url.openStream()));

            String inputLine;
            final StringBuffer buffer = new StringBuffer();

            while ((inputLine = bufferedReader.readLine()) != null) {
                buffer.append(inputLine);
            }

            bufferedReader.close();
            result = buffer.toString();

            Log.i("download", result);
            inputStream.close();

            return result;
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
            return "";
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return "";
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }

    }
}

Вот метод, который очищает код HTML для информации:

    public void getInfo()
    {
    final SiteInfo task= new SiteInfo();
    String result;

    try
    {

        result= task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,"*random site url*").get();

        String[] temp;
        Pattern urlName= Pattern.compile("<div class=\"image\"><img src=\"\"(,*?)\"/");
        Matcher matcher=urlName.matcher(result);

        for(int i=0; matcher.find(); i++)
        {
            temp=matcher.group(1).split("\" alt=\"");
            imageURL.set(i,temp[i]);
            name.set(i,temp[i+1]);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

И последний вызов метода в onCreate:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView=findViewById(R.id.imageView);
    startButton=findViewById(R.id.startButton);
    getInfo();

}

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Не используйте AsyncTask.get(), вместо этого вы должны использовать new SiteInfo().excute("*random site url*"), чтобы запустить AsyncTask, а затем внутри SiteInfo переопределить onPostExecute(), чтобы получить свои результаты.

, возможно, вы захотите сделать другое интерфейс для возврата результатов в вашу деятельность.

если у вас есть какие-либо вопросы о том, как это сделать, дайте мне знать

Я проверил это сейчас, и это работает на моем телефоне, не используйте Журнал, чтобы увидеть ответ html Журнал может не просматривать длинные сообщения, вместо этого вы можете Logger

это был мой код

public class MainActivity extends AppCompatActivity implements DataInterface 
{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new SiteInfo(this).execute("https://code.visualstudio.com/");
    Logger.addLogAdapter(new AndroidLogAdapter());

}

@Override
public void returnData(String result) {
    Logger.e(result);
}

public class SiteInfo extends AsyncTask<String, Void, String> {
    DataInterface dataInterface;

    SiteInfo(DataInterface dataInterface) {
        super();
        this.dataInterface = dataInterface;
    }

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

        URL url;
        String result;
        InputStream inputStream;
        BufferedReader bufferedReader;

        try {

            url = new URL(urls[0]);
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream = url.openStream()));

            String inputLine;
            final StringBuilder buffer = new StringBuilder();

            while ((inputLine = bufferedReader.readLine()) != null) {
                buffer.append(inputLine);
            }

            bufferedReader.close();
            result = buffer.toString();

            Log.i("download", result);
            inputStream.close();

            return result;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return "";
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }

    }

    @Override
    protected void onPostExecute(String result) {
        dataInterface.returnData(result);
    }
}
}

и интерфейс

public interface DataInterface {
   void returnData(String result);
}
0 голосов
/ 06 января 2020

Не используйте метод get() в асинхронной задаче.

Это приведет к зависанию вашего приложения во время загрузки.

Вместо этого обработайте результат doInBackground в onPostExecute ().

...