Android 从公共类中的AsyncTask更新UI线程

Android 从公共类中的AsyncTask更新UI线程,android,android-asynctask,Android,Android Asynctask,我试图将一些AsyncTask类拆分为公共(单独)函数,这样就不必重写太多代码。我几乎做到了,除了一个非常重要的方面。AsyncTask函数通过对服务器进行php调用来编译ArrayList。完成此列表后,我需要更新主UI线程上的微调器。我找到了一个非常好的答案,但我有一点困难,使它的工作 这里是我所拥有的东西的缩小版本:(注意,在这一点上,我所要做的就是调用Toast消息来证明往返是有效的) 以下是调用活动: public class MyActivity extends Activity i

我试图将一些AsyncTask类拆分为公共(单独)函数,这样就不必重写太多代码。我几乎做到了,除了一个非常重要的方面。AsyncTask函数通过对服务器进行php调用来编译ArrayList。完成此列表后,我需要更新主UI线程上的微调器。我找到了一个非常好的答案,但我有一点困难,使它的工作

这里是我所拥有的东西的缩小版本:(注意,在这一点上,我所要做的就是调用
Toast
消息来证明往返是有效的)

以下是调用
活动

public class MyActivity extends Activity implements OnTaskCompleted {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sg_list = new ArrayList<String>();
        new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...").execute();
    }

    public void onTaskCompleted(ArrayList<String> list) {
        Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show();
    }

}

您从不调用
setSuperGroupList()
,因此
侦听器保持空。最好将侦听器放入任务的构造函数中。

您选择了正确的路径。但是我不清楚onPostExecute(..)方法中的问题。是关于空pDialog还是空sg_列表。如果sg_列表中存在问题,请检查php方法是否有效?php服务清单文件中的权限可能有问题。
所以我建议首先在UI线程上检查您的方法。然后在后台线程中将其更改为do。

您还可以将toast放在onPostExecute方法中,以检查sg_列表内容。

您需要添加一个函数setListener:

public class TaskComplete {
    public OnTaskCompleted onTaskListenerComplete;

    public interface OnTaskCompleted {
        void onTaskCompleted(ArrayList<String> list);
    }

    public void setOnTaskComplete(OnTaskCompleted onTaskListenerComplete){
        this.onTaskListenerComplete = onTaskListenerComplete;
    }
}
公共类任务完成{
公共OnTaskCompleted onTaskListenerComplete;
已完成ONTASKC的公共接口{
void onTaskCompleted(数组列表);
}
公共void setOnTaskComplete(OnTaskCompleted onTaskListenerComplete){
this.ontasklistenerplete=ontasklistenerplete;
}
}
在活动中,定义并设置它:

public class MyActivity extends Activity implements OnTaskCompleted {
    public TaskComplete task;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sg_list = new ArrayList<String>();
        task.setOnTaskComplete(this);
        new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...").execute();
    }

    public void onTaskCompleted(ArrayList<String> list) {
        Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show();
    }

}
公共类MyActivity扩展活动实现OnTaskCompleted{
公共任务完成任务;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sg_list=new ArrayList();
task.setOnTaskComplete(这个);
新建GetSuperGroups(updateAffiliationsReferences.this,上下文,“检索组列表…”)。执行();
}
已完成公用void ontask(数组列表){
Toast.makeText(getApplicationContext(),“异步hello”,Toast.LENGTH\u SHORT.show();
}
}
在异步任务中:

protected void onPostExecute(ArrayList<String> sg_list) {
    pDialog.dismiss();
    //this next line causes a null pointer error
    //note that I am throwing away the array list for now
    //all I want to do is prove that I can call the Toast back in the calling Activity
    activity.onTaskCompleted(new ArrayList<String>());
}
受保护的void onPostExecute(ArrayList sg_列表){
pDialog.disclose();
//下一行导致空指针错误
//请注意,我现在正在丢弃数组列表
//我所要做的就是证明我可以在呼叫活动中回呼祝酒词
activity.onTaskCompleted(新的ArrayList());
}

希望它有用。

只需在
异步任务中添加
OnTaskCompleted listener
参数
构造函数
获取超级组
。然后在执行
异步任务时传递

public class MyActivity extends Activity implements OnTaskCompleted {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            sg_list = new ArrayList<String>();
            new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...", this).execute();
        }

        public void onTaskCompleted(ArrayList<String> list) {
            Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show();
        }

    }
公共类MyActivity扩展活动实现OnTaskCompleted{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sg_list=new ArrayList();
新建GetSuperGroups(updateAffiliationsReferences.this,上下文,“检索组列表…”,this.execute();
}
已完成公用void ontask(数组列表){
Toast.makeText(getApplicationContext(),“异步hello”,Toast.LENGTH\u SHORT.show();
}
}

  public class GetSuperGroups extends AsyncTask<String, String, ArrayList<String>> {

        private Activity activity;
        private Context context;
        private String progressMsg;
        private ProgressDialog pDialog;
        private ArrayList<String> sg_list;
        private OnTaskCompleted listener;

        public GetSuperGroups(Activity activity, Context context, String progressMsg, OnTaskCompleted listener) {
            this.activity = activity;
            this.context = context;
            this.progressMsg = progressMsg;
            this.listener = listener;
        }
公共类GetSuperGroups扩展异步任务{
私人活动;
私人语境;
私有字符串progressMsg;
私人对话;
私人ArrayList sg_列表;
私有OnTaskCompleted侦听器;
public GetSuperGroups(活动活动、上下文上下文、字符串progressMsg、OnTaskCompleted侦听器){
这个。活动=活动;
this.context=上下文;
this.progressMsg=progressMsg;
this.listener=listener;
}

谢谢。我的脑袋在旋转。我不知道该从哪里调用它。这并不重要,因为它没有启动任何动作。因此,将侦听器添加为构造函数参数似乎很好,因为它保证了侦听器的设置。您可能需要考虑使用安卓ID.OS.HANDER而不是您自己的侦听接口。它不是。请注意,尽管我构建了它并最终打算使用它,但现在我甚至没有引用它。是侦听器为null,但我不知道如何实例化它。我认为这会泄漏内存,因为您将活动实例传递给任务,然后如果活动旋转或出于某种原因必须为destroyed在任务完成之前不会进行GCed。。。
public class MyActivity extends Activity implements OnTaskCompleted {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            sg_list = new ArrayList<String>();
            new GetSuperGroups(UpdateAffiliationsPreferences.this, context, "Retrieving Group List...", this).execute();
        }

        public void onTaskCompleted(ArrayList<String> list) {
            Toast.makeText(getApplicationContext(), "hello from async", Toast.LENGTH_SHORT).show();
        }

    }
  public class GetSuperGroups extends AsyncTask<String, String, ArrayList<String>> {

        private Activity activity;
        private Context context;
        private String progressMsg;
        private ProgressDialog pDialog;
        private ArrayList<String> sg_list;
        private OnTaskCompleted listener;

        public GetSuperGroups(Activity activity, Context context, String progressMsg, OnTaskCompleted listener) {
            this.activity = activity;
            this.context = context;
            this.progressMsg = progressMsg;
            this.listener = listener;
        }