无法从Android AsyncTask访问Activity的方法

时间:2012-08-08 19:57:20

标签: android android-layout android-intent android-emulator android-widget

我遇到一个问题,我需要从Android AsyncTask的onPostExecute()方法访问我的Activity中的方法

我有2个活动都包含一个常用方法如下:

(1)活动1 - > refreshUI()
(2)活动2 ----> refreshUI()

我有一个AsyncTask调用GetDataAsyncTask(Activity a ),它将调用活动作为参数

现在,从我的活动1开始,我将致电新GetDataAsyncTask(Activity1.this).execute 与我的activity2相同,我将调用新的GetDataAsyncTask(Activity2.this).execute

我的AsyncTask如下:

public class GetDataAsyncTask extends AsyncTask<String ,Void , String> {
    public Activity context;

    public PostAsyncTaskHelper(Activity c) { 
        context = c; 
    }

    protected String doInBackground(String... arg0) {
        // Webservice calls 
    }

    protected void onPostExecute(String result) {
        if(result.equals("qq")) {
            //Where I am not able to access refreshUI() 
            //method of any one of my activities
            context.refreshUI()  
        }
    }
}

任何人都可以帮助我如何从AsyncTask

获取任何被调用活动的参考

3 个答案:

答案 0 :(得分:5)

创建一个interface方法refreshUI(),并使Activity1和Activity2都实现它。然后,您只需要将context类型转换为接口类型。

此外,您需要注意从Activity内部保持对AsyncTask的引用,因为在配置更改(如屏幕旋转)的情况下,您将坚持到一个被破坏的Activity实例。 See here了解详细信息,以及相应的example solution

答案 1 :(得分:2)

定义活动的界面

public interface MyActivityRefreshInterface
{
 public void refreshUI();
}

您的活动必须定义为implements MyActivityRefreshInterface

然后你的onPostExecute可以将上下文转换为(MyActivityRefreshInterface)上下文

答案 2 :(得分:1)

因为refreshUI不是Activity中的方法。它位于您的特定Acivity1和Activity 2类中,而不是Android中的Activity类。您应该重构,以便Activity1和Activity2从BaseActivity继承,并在其上使用refreshUI方法,并将AsyncTask中的上下文标记为BaseActivity