Android Studio Активность начала отложена - PullRequest
0 голосов
/ 01 марта 2019

Я получил AsyncTask:

 package e.marco.swimcommit;


import android.os.AsyncTask;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;


public class News extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... strings) {
        final StringBuilder builder = new StringBuilder();
        final StringBuilder builder2 = new StringBuilder();
        {
            try {
                Document doc = Jsoup.connect("http://www.schwimmclub-schwandorf.de/index.php/8-home/56-infos-neuigkeiten").get();
                String title = doc.title();
                Elements links = doc.select("h2");
                Elements links2 = doc.select("h3");
                builder.append(title).append("\n");
                for (Element link : links) {
                    builder.append(link.text()).append("$");
                }
                for (Element link : links2) {
                    builder2.append(link.text()).append("$");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String text = builder.toString() + "%" + builder2.toString();
        return text;
    }
}

и метод onResume в моей MainActivity, который устанавливает возвращаемый текст в текстовом представлении

  @Override
    protected void onResume()
    {
        super.onResume();
        try {
            eins.setText(new News().execute().get());
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Но если я запускаю приложение, оно показывает мнебелый экран, пока метод onResume не получит текст и не установит его в Textview.Как можно загрузить приложение, отображающее все другие элементы, такие как фон кнопок и т. Д., Без отложенного запуска?Так что Textview будет пустым, пока метод onResume не получит информацию и не установит ее?Изменить: без блокировки пользовательского интерфейса

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

В соответствии с предложением pz64 , установите текст в методе onPostExecute() и вызовите AsyncTask() без вызова метода get().get() метод в AsyncTask делает задачу синхронной, а также влияет на ваш пользовательский интерфейс.

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

    @override
    protected void onPreExecute(){
         //initiate your loading views
    }

    @Override
    protected String doInBackground(String... strings) {
        final StringBuilder builder = new StringBuilder();
        final StringBuilder builder2 = new StringBuilder();
        {
            try {
                Document doc = Jsoup.connect("http://www.schwimmclub-schwandorf.de/index.php/8-home/56-infos-neuigkeiten").get();
                String title = doc.title();
                Elements links = doc.select("h2");
                Elements links2 = doc.select("h3");
                builder.append(title).append("\n");
                for (Element link : links) {
                    builder.append(link.text()).append("$");
                }
                for (Element link : links2) {
                    builder2.append(link.text()).append("$");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String text = builder.toString() + "%" + builder2.toString();
        return text;
    }
    @override
    protected void onPostExecute(String response){
        //dispose loading views
        if(response != null){
            eins.setText(response);
        }else{
             //could not load
        }
    }
}

Вызов:

@Override
protected void onResume()
{
    super.onResume();
    new News().execute(); //do not call get method
}
0 голосов
/ 01 марта 2019

Вы можете вызвать asyncTask в методе oncreate.И установите результат в методе onProgressUpdate.

@Override
protected void onProgressUpdate(String... text) {
    eins.setText.setText(text);    
}
0 голосов
/ 01 марта 2019

AsyncTask используется для выполнения фоновых операций и публикации результатов в потоке пользовательского интерфейса.В вашем случае вы должны поместить eins.setText в onPostExecute AsyncTask.

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

Новости

public class News extends AsyncTask<String, Void, String> {
    private WeakReference<OnNewsListener> mOnNewsListener;

    public void setOnNewsListener(OnNewsListener listener) {
        mOnNewsListener = new WeakReference<>(listener);
    }

    @Override
    protected String doInBackground(String... strings) {
        final StringBuilder builder = new StringBuilder();
        final StringBuilder builder2 = new StringBuilder();
        {
            try {
                Document doc = Jsoup.connect("http://www.schwimmclub-schwandorf.de/index.php/8-home/56-infos-neuigkeiten").get();
                String title = doc.title();
                Elements links = doc.select("h2");
                Elements links2 = doc.select("h3");
                builder.append(title).append("\n");
                for (Element link : links) {
                    builder.append(link.text()).append("$");
                }
                for (Element link : links2) {
                    builder2.append(link.text()).append("$");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String text = builder.toString() + "%" + builder2.toString();
        return text;
    }

    @Override
    protected void onPostExecute(String text) {
        if (mOnNewsListener != null) {
            if (mOnNewsListener.get() != null) {
                mOnNewsListener.get().onNews(text);
            }
        }
    }

    public interface OnNewsListener {
        void onNews(String text);
    }
}

MainActivity

public class MainActivity extends AppCompatActivity implements News.OnNewsListener{
    TextView eins;

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

        eins = findViewById(R.id.eins);
    }

    @Override
    protected void onResume() {
        super.onResume();

        News news = new News();
        news.setOnNewsListener(this);
        news.execute();
    }

    @Override
    public void onNews(String text) {
        eins.setText(text);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...