我有一个应用程序从两个网络加载广告,并在启动时将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());
答案 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