2013-03-16 55 views
1

我有一個應用程序,它從兩個網絡加載廣告,並在啓動時將flash文件設置爲webview。這使得它在啓動時太慢,論壇告訴我使用asynctask.Can一些一個使這個代碼成爲一個asynctask。使用asynctask加速android應用程序啓動時間

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

回答

1

我不能只是讓你的代碼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你做的是,在其他方法。完成網絡資料後,您可以在onPostExecute()中更新UI

這是你將如何調用任務

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,你想

任何其他PARAMS

我強烈建議通過下面的文檔會,並確保你明白怎麼運行的。可能最需要了解的一點是,doInBackground()不會在UI上運行,因此您不希望在此嘗試更新任何Views,而是在其他AsyncTask方法中或通過將數據傳回MainActivity並在那裏更新 AsyncTask

+0

如果我只需要airpush服務在後臺完成我應該怎麼做?我是一個初學者容忍我:( – 2013-03-16 23:52:49

+0

我不熟悉airpush,但如果它需要網絡連接,那麼你可以在'doInBackground()'中做到這一點,如果你想要它返回'UI'或任何其他結果因此,你只需將這些結果傳遞給'onPostExecute()',而不需要'AsyncTask'的其他方法。只要你正在嘗試,而不只是尋找某人編寫代碼,我就可以容忍你。不得不在某處開始,所以不要擔心:) – codeMagic 2013-03-17 00:09:03

+0

在「返回某些東西」中,我應該放什麼東西而不是東西? – 2013-03-17 00:12:29

3

這將更加有助於你花一點點時間瞭解一個AsyncTask比別人來簡單地讓一個適合你的架構。

AsyncTask實際上是一個相當簡單的類來擴展和使用。 AsyncTask最簡單的形式可以是在後臺運行的代碼(離開UI線程 - 這是導致鎖定的原因),但是它被設置爲允許一些代碼在後臺運行,一些代碼需要在後臺運行/之後,並根據需要執行一些代碼作爲進度更新。

您需要創建自己的類來擴展AsyncTask,如下所示。你的任務將需要三個參數。第一個會傳入在後臺運行的doInBackground函數,第二個是可以傳遞到進度更新函數的參數的類型,第三個是要傳遞到您的onPostExecute fn的類型,該類型運行在後臺功能完成後的UI線程。在下面的簡單示例中,我將不包含要傳遞給post執行函數或進度更新函數的類型,因此它們將是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();。你可以read more about that here。但是,您的代碼確實加載了一個url(mWebView.loadUrl),所以我認爲這可能是一個很大的瓶頸!

只是作爲附錄,如果你想在一個的AsyncTask的深度例如更多信息,下面是一個IC &鈀from this useful documentation

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使用該參數。

+0

thnx for ur help,但我對編程知之甚少我18歲!我從互聯網 – 2013-03-16 23:45:44

+0

瞭解到,這是完全酷!只是繼續使用互聯網。尤其是Android文檔。最重要的是讀取很多東西,並在詢問之前真正嘗試解決方案,並且*從不*要求人們爲您編寫代碼。:)對於新手來說,AsyncTasks也可能非常棘手,因爲它們包含一些細微的線程相關的想法,但我想這就是你想要優化的東西!正如Don Knuth所說:「我們應該忘記小效率,大約97%的時間:不成熟的優化是萬惡之源」 – 2013-03-16 23:50:43

+0

這裏使用的是什麼陣列?我能保持這樣嗎? – 2013-03-16 23:59:11

相關問題