AsyncTask中的多个函数调用doInBackground()导致“Activity已泄漏窗口”崩溃!为什么?

时间:2012-05-25 08:01:29

标签: android android-asynctask

我有一个简单的AsyncTask,其doInBackground()调用一个函数fn1,而函数fn1又调用另一个fn2。结果是“活动已泄露窗口”崩溃!当我直接从doInBackground()调用fn2时,一切正常。这是否意味着在一个线程中,不能有超过1级的fn调用?(Thread-> fn1-> fn2)

我是Java和Android的新手,所以如果这是一个基本问题,请耐心等待!日Thnx。

我的代码算法是这样的:

MyActivity:

MyLibrary myLib;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.myXML);

    myLib = new MyLibrary(MyActivity.this);
    new myTask().execute();

}

private class myTask extends AsyncTask<Void, Void, Void> 
{

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(MyActivity.this, "", "Fetching Data...");
    }
    @Override
    protected Void doInBackground(Void... params) {

            myLib.fn1();        
            return null;

    }

    @Override
    protected void onPostExecute(Void result) {

        progressDialog.dismiss();
    }
}

MyLibrary:

Context ctx;
String iVar;

public MyLibrary(Context context){
    this.ctx = context;
}

public void fn1()
{

  fn2();
  Log.d("TAG", "Function 1";
}

public void fn2()
{
   iVar = "100"; 
   Log.d("TAG", "Function 2";
}

3 个答案:

答案 0 :(得分:2)

在您的活动代码中添加以下内容:

@Override
protected void onPause() {
    super.onPause();

    if(progressDialog != null)
        progressDialog.dismiss();
}

如果您离开活动,它将关闭对话框窗口。

答案 1 :(得分:0)

通常,当您引用的Activity已从ActivityStack顶部删除时,会发生此错误。您应该检查AsyncTask是否已正确嵌入到Activity的生命周期中。

祝福, 添

答案 2 :(得分:0)

在嵌套函数调用期间,ProgressDialog可能会崩溃。