我需要在一个单独的线程中实例化一些对象,因为我不希望UI变慢。使用AsyncTask我遇到了内存问题:GC不会释放内存。
所以我发现解决方案将AsyncTask声明为静态内部类。我是android新手,所以我需要你的帮助,因为我有一个NullPointerException。这是我的代码:
-static变量,因为内部静态类 -
public class Wash extends ActionBarActivity {
private static Effetti effect1,effect2,effect3…effect50
private static Effetti[] effects;
.
.
.
- 静态内部阶级 -
private static class TaskL extends AsyncTask <Effetti[], Void,Effetti[]> {
@Override
protected Effetti[] doInBackground(Effetti[]... params) {
effects = new Effetti[]{
effects1 = new Effetti(MyApplication.getAppContext(),R.raw.ef1),
effect2=new Effetti(MyApplication.getAppContext(),R.raw.ef2),
effect3 = new Effetti(MyApplication.getAppContext(),R.raw.ef3),
effect4 = new Effetti(MyApplication.getAppContext(),R.raw.ef4),
.
.
.
};
return effects;
}
@Override
protected void onPostExecute(Effetti[] result) {
super.onPostExecute(result);
}
}
“Effetti”类是一个包含播放和停止音频文件的SoundPool方法的类。还包含带有上下文和渣油等参数的构造函数。
我使用了这篇文章中的MyApplication.getAppContext()技巧:
Static way to get 'Context' on Android? android
有什么建议吗? thaks
答案 0 :(得分:0)
我认为此行MyApplication.getAppContext()
正在为您提供NullPointerException
。
您可以尝试这样做:
private static class TaskL extends AsyncTask <Effetti[],Void,Effetti[]> {
Activity activity;
updateDashboardContent(Activity a){
activity=a;
}
@Override
protected Effetti[] doInBackground(Effetti[]... params) {
effects = new Effetti[]{
effects1 = new Effetti(activity.getApplicationContext(),R.raw.ef1),
effect2=new Effetti(activity.getApplicationContext(),R.raw.ef2),
effect3 = new Effetti(activity.getApplicationContext(),R.raw.ef3),
effect4 = new Effetti(activity.getApplicationContext(),R.raw.ef4),
.
.
.
};
return effects;
}
@Override
protected void onPostExecute(Effetti[] result) {
super.onPostExecute(result);
}
}
根据您的代码中的哪一部分,您可以这样称呼它:
new TaskL(getActivity()).execute(...);
或new TaskL(this).execute(...);
如果上面的片段不起作用,那么尝试传递给TaskL的构造函数一个Effetti数组(用我做的&#39; activity&#39;),变量effect1,effects2 ...已经实例化避免在AsyncTask中实例化它们......