亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android Studio Activity 啟動延遲

Android Studio Activity 啟動延遲

牧羊人nacy 2022-07-14 09:52:57
我有一個異步任務: 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;    }}和我的 MainActivity 中的 onResume Methode 將返回的文本設置在文本視圖中  @Override    protected void onResume()    {        super.onResume();        try {            eins.setText(new News().execute().get());        } catch (ExecutionException e) {            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        }    }但是,如果我啟動應用程序,它會顯示一個白屏,直到 onResume Methode 獲取文本并將其設置為 Textview。如何在沒有延遲啟動的情況下加載應用程序顯示所有其他元素,如按鈕背景等?以便在 onResume Methode 獲取信息并設置之前 Textview 是空白的?編輯:不阻塞用戶界面
查看完整描述

3 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

AsyncTask 用于執行后臺操作并在 UI 線程上發布結果。在您的情況下,您應該放入eins.setTextAsyncTask onPostExecute。


另一個問題是因為 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);

    }

}

主要活動


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

    }

}


查看完整回答
反對 回復 2022-07-14
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

根據pz64的建議,在方法中設置文本onPostExecute()并調用AsyncTask()不調用get()方法。get()AsyncTask 上的方法使任務同步并影響您的 UI。


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

}


查看完整回答
反對 回復 2022-07-14
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

您可以在 oncreate 方法中調用 asyncTask。并在 onProgressUpdate 方法中設置結果。


@Override

protected void onProgressUpdate(String... text) {

    eins.setText.setText(text);    

}


查看完整回答
反對 回復 2022-07-14
  • 3 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號