Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从另一个类调用AsyncTask_Android_Android Asynctask - Fatal编程技术网

Android 从另一个类调用AsyncTask

Android 从另一个类调用AsyncTask,android,android-asynctask,Android,Android Asynctask,在现有应用程序中,我有一个活动,其内部类扩展了AsyncTask,如下所示: public class Activity_1 extends BaseActivity { .... new async().execute(); ... public class asyncextends AsyncTask<Void, Void, String> { protected String doInBackground(Void... pro

在现有应用程序中,我有一个活动,其内部类扩展了AsyncTask,如下所示:

public class Activity_1 extends BaseActivity {
    ....
    new async().execute();
    ...

    public class asyncextends AsyncTask<Void, Void, String> {
        protected String doInBackground(Void... progress) { ... }
        protected void onPreExecute() { ... }
        protected void onPostExecute(String result) { ... }
    }
}
public class Activity_1 extends BaseActivity {

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(new MyAsyncTask.MyAsyncTaskListener() {
       @Override
       void onPreExecuteConcluded() {
           // gui stuff
       }

       @Override
       void onPostExecuteConcluded(String result) {
           // gui stuff
       }
    });
    aTask.execute();
    ...
}    
公共类活动\u 1扩展了基本活动{
....
新建异步().execute();
...
公共类异步任务{
受保护的字符串doInBackground(Void…progress){…}
受保护的void onPreExecute(){…}
受保护的void onPostExecute(字符串结果){…}
}
}
现在,我需要从另一个活动调用同一个doInBackground方法,但这个内部类的
onPostExecute()
操作一些本地UI变量,所以不可能从clas外部使用它。
是否有任何方法可以调用此AsyncTask,只需重写
onPostExecute
onPreExecute
-方法,或者在其他活动中创建另一个内部类,执行相同的后台操作(当然,将其移动到公共实用程序类或其他对象),等等?

您可以创建一个单独的抽象包私有类,扩展
AsyncTask
并实现
doInBackground()
方法:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }
}
如果
onPreExecute
onPostExecute
也包含一些常见操作,则可以应用以下模式:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    public interface MyAsyncTaskListener {
       void onPreExecuteConcluded();
       void onPostExecuteConcluded(String result);  
    }

    private MyAsyncTaskListener mListener;

    final public void setListener(MyAsyncTaskListener listener) {
       mListener = listener;
    }

    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }

    @Override
    final protected void onPreExecute() {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPreExecuteConcluded();
    }

    @Override
    final protected void onPostExecute(String result) {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPostExecuteConcluded(result);
    }
}
您还可以让您的
活动
实现
MyAsyncTaskListener

public class Activity_1 extends BaseActivity implements MyAsyncTask.MyAsyncTaskListener {
    @Override
    void onPreExecuteConcluded() {
        // gui stuff
    }

    @Override
    void onPostExecuteConcluded(String result) {
       // gui stuff
    }

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(this);
    aTask.execute();
    ...

}

我从头开始写代码,所以可能有错误,但它应该说明这一点。

如果我们在一个类中创建一个静态方法,并且将在AsyncTask的doInBackground中的任何类中执行,那么我们可以通过同一个类,甚至在不同的类中轻松地更新UI。

只需构建一个主类的对象,然后像这样调用内部类就可以了

 OuterMainClass outer = new OuterMainClass();
       outer.new InnerAsyncClass(param)
         .execute();
这个答案对你来说太晚了,但希望它能帮助别人


谢谢。在ClassOne中创建AsynckTask的构造函数

2.按新关键字装箱对象或类1

3.按对象调用异步任务

ClassOne{

class AsyncParmas extends AsyncTask {

        public ADDloadGeofenceDetails() {
        }

        @Override
        protected void onPreExecute() {


            super.onPreExecute();
        }

        @Override
        protected Object doInBackground(Object... params) {

}
}

Class ClassTwo{
ClassOne obj= new ClassOne ();

                    obj.new AsyncParmas ().execute();
}
}

祝那些面临问题的人好运。

正是我想要的。明天早上第一件事就是实施它。工作得很有魅力。谢谢回答得好!但是我不明白为什么我要为
MyAsyncTask aTask=newmyasynctask()获得以下内容无法实例化MySyncTask类型,如有任何帮助,将不胜感激@Smittey必须是复制粘贴错误-MyAsyncTask的第二个实现不应该是非常好的示例,尤其是侦听器实现。在我当前的项目中工作得非常好!:)很高兴它帮助了某人:)嘿,你能帮我一个忙吗。。它工作得非常好,但现在我必须将值返回给调用方类,我应该如何做。。?我从另一个类调用了Asynctask类。所以我想得到调用方类中asyncTask的结果。你知道怎么做吗。?谢谢:)从AsyncTask的onPostExecute()方法调用调用调用方类的方法是的。这将起作用,但如果我想为多个类实现这一点。使一个静态对象从不同的类和onPostExc传递不同的值。。方法检查onPostEx中该变量的值。。方法,从那里你可以知道哪个类简单地从“if”语句调用了相应的方法。用具体的例子给出答案,只是一个供参考的答案是没有帮助的
ClassOne{

class AsyncParmas extends AsyncTask {

        public ADDloadGeofenceDetails() {
        }

        @Override
        protected void onPreExecute() {


            super.onPreExecute();
        }

        @Override
        protected Object doInBackground(Object... params) {

}
}

Class ClassTwo{
ClassOne obj= new ClassOne ();

                    obj.new AsyncParmas ().execute();
}
}