1

我有一个应用程序,它从两个网络加载广告,并在启动时将 Flash 文件设置为 webview。这使得启动速度太慢,论坛告诉我使用 asynctask。有人可以将此代码设为 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());
4

2 回答 2

4

花一点时间来理解一个架构的架构对AsyncTask你来说比让别人简单地为你做一个架构会更有帮助。

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

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

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

因此,您通常可以将花费很长时间的代码粘贴到该doInBackground函数中,但您必须小心,因为它不在 UI 线程上,并且某些代码确实必须在 UI 线程上运行。

我建议做一些分析,看看具体是什么代码阻塞了你的 UI 线程,然后使用 AsyncTask 在后台运行它。您可以通过在 Eclipse 中使用 DDMS 并使用方法分析来做到这一点。另一种方法是使用Debug类并Debug.startMethodTracing("tracefilename");在您想要开始时调用Debug.stopMethodTracing();. 您可以在此处阅读更多相关信息。但是,您的代码确实加载了一个 url ( mWebView.loadUrl),所以我认为这可能是一个很大的瓶颈!

就像附录一样,如果您想要更深入的 AsyncTask 示例,这里是这个有用文档中的一个 I C&Pd :

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

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

于 2013-03-16T23:40:42.630 回答
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您在其他方法中所做的,您将放入的所有网络内容。完成网络内容后,您可以UIonPostExecute().

这就是您调用任务的方式

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那里更新 AsyncTask

于 2013-03-16T23:44:48.123 回答