使用asynctask加速Android应用程序启动时间

时间:2013-03-16 23:18:24

标签: android android-asynctask

我有一个应用程序从两个网络加载广告,并在启动时将flash文件设置为webview。这使得它在启动时太慢,论坛告诉我使用asynctask.Can有人使这个代码成为asynctask。

        public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    airpush=new Airpush(getApplicationContext());
    airpush.startPushNotification(false);
    airpush.startIconAd();
    airpush.startDialogAd();
    airpush.startAppWall();

    mWebView = (WebView) findViewById(R.id.webview);

    mWebView.getSettings().setJavaScriptEnabled(true);

    mWebView.getSettings().setPluginsEnabled(true);

    mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

    mWebView.setBackgroundColor(Color.parseColor("#000000"));

    mWebView.loadUrl("file:///android_asset/game.swf");

    AdView adView = (AdView)this.findViewById(R.id.adView);
    adView.loadAd(new AdRequest());

2 个答案:

答案 0 :(得分:4)

花一点时间来理解AsyncTask的体系结构比为某人简单地为你制作一个体系结构更有帮助。

AsyncTask实际上是一个非常简单的扩展和使用类。 AsyncTask最简单的形式可以是在后台运行的代码(在UI线程之外 - 这是导致锁定的原因),但是设置为允许一些代码在后台运行,一些代码在之前执行/ after,以及一些代码,如有必要,可以作为进度更新执行。

您需要创建自己的类,扩展AsyncTask,如下所示。您的任务将采用三个参数。第一个将传递到在后台运行的doInBackground函数,第二个是可以传递给进度更新函数的参数的类型,第三个是要传递给{{{ 1}} fn在后台函数完成后在UI线程上运行。在下面的简单示例中,我将不包括要传递给后执行函数或进度更新函数的类型,因此它们将是Void类型。

onPostExecute

如果您想运行任务,请拨打以下电话:

 private class YourTask extends AsyncTask<byte[], Void, Void> {

     protected Long doInBackground(byte[]... data) {
         //get the array
         byte[] array = data[0];

         //do something with it.
         HERE IS WHERE YOU RUN YOUR CODE IN THE BACKGROUND THAT IS TAKING TOO LONG ON THE UI THREAD

         //return null because this type needs to match the last type for returning to the postexec fn
         return null;
     }

 }

因此,您经常可以将需要很长时间的代码粘贴到new YourTask().execute(someByteArray); 函数中,但是您必须小心,因为它不在UI线程中,并且某些代码必须在UI线程上运行

我建议进行一些分析,看看哪些代码特别扼杀了你的UI线程,并使用AsyncTask在后台运行THAT。您可以通过在Eclipse中使用DDMS并使用方法分析来实现。另一种方法是使用doInBackground课程,并在您想要开始Debug时致电Debug.startMethodTracing("tracefilename");。你可以read more about that here。但是,您的代码确实加载了一个网址(Debug.stopMethodTracing();),所以我认为这可能是一个很大的瓶颈!

正如附录一样,如果你想要一个更深入的AsyncTask示例,这里有一个I C&amp; Pd from this useful documentation

mWebView.loadUrl

上面的示例包含的代码既可以说明后台任务期间UI上的更新进度,也可以传递一个参数,然后由UI线程运行后执行fn。

答案 1 :(得分:2)

我不能只让你的代码成为AsyncTask,但我可以给你一个例子和一些帮助。这是AsyncTask

的示例
public class TalkToServer extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);

}

@Override
protected String doInBackground(String... params) {
//do your work here
    return something;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
       // do something with data here-display it or send to mainactivity

}

您将放入doInBackground()的所有网络内容,如果您需要更新其他方法中的UI。完成网络内容后,您可以在UI更新onPostExecute()

这就是你如何调用任务

TalkToServer myAsync = new TalkToServer() //can add params if you have a constructor
myAsync.execute() //can pass params here for `doInBackground()` method

如果它是MainActivity的内部类,那么它将有权访问MainActivity的成员变量。如果它是一个单独的类,那么您可以将context传递给构造函数,如

TalkToServer myAsync = new TalkToServer(this);

并创建一个构造函数来接受Context以及您想要的任何其他参数

我强烈建议您浏览下面的文档,并确保了解其工作原理。入门时最重要的事情可能就是doInBackground() UI未在Views上运行,所以您不想在此处尝试更新任何AsyncTask,而在另一个MainActivity {{1}} 1}}方法或将数据传递回{{1}}并在那里更新 AsyncTask