Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio活动启动延迟_Java_Android_Performance - Fatal编程技术网

Java Android Studio活动启动延迟

Java Android Studio活动启动延迟,java,android,performance,Java,Android,Performance,我有一个任务: 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 Asy

我有一个任务:

 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方法获取文本并将其设置为Textview。在没有延迟启动的情况下,如何加载应用程序并显示按钮、背景等所有其他元素?所以在onResume方法获取信息并进行设置之前,Textview是空白的?
编辑:在不阻塞UI的情况下,AsyncTask用于在UI线程上执行后台操作和发布结果。在您的情况下,应该将
eins.setText
放入AsyncTask的
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);
    }
}

AsyncTask用于在UI线程上执行后台操作和发布结果。在您的情况下,应该将
eins.setText
放入AsyncTask的
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);
    }
}
按照的建议,在
onPostExecute()
方法中设置文本,并调用
AsyncTask()
,而不调用
get()
方法get()方法使任务同步,并影响您的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
        }
    }
}
按照的建议,在
onPostExecute()
方法中设置文本,并调用
AsyncTask()
,而不调用
get()
方法get()方法使任务同步,并影响您的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
        }
    }
}

您可以在oncreate方法中调用asyncTask。 并在onProgressUpdate方法中设置结果

@Override
protected void onProgressUpdate(String... text) {
    eins.setText.setText(text);    
}

您可以在oncreate方法中调用asyncTask。 并在onProgressUpdate方法中设置结果

@Override
protected void onProgressUpdate(String... text) {
    eins.setText.setText(text);    
}

在AsyncTask内的
onPostExecute
方法上查看将文本设置为文本查看在AsyncTask内查看将文本设置为文本查看在
onPostExecute
方法上查看这是正确答案,已解释并附有示例这是正确答案,已解释并附有示例