如何让Asynctask静态内部类实例化外部对象

时间:2015-03-27 17:10:34

标签: android android-asynctask static inner-classes

我需要在一个单独的线程中实例化一些对象,因为我不希望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

1 个答案:

答案 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中实例化它们......