首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:如何向异步任务的onPreExecute()传递参数?

Android:如何向异步任务的onPreExecute()传递参数?
EN

Stack Overflow用户
提问于 2010-06-19 17:23:16
回答 2查看 150.3K关注 0票数 118

我使用AsyncTask加载作为内部类实现的操作。

onPreExecute()中,我显示了一个加载对话框,然后在onPostExecute()中再次将其隐藏。但是对于一些加载操作,我预先知道它们会很快完成,所以我不想显示加载对话框。

我想通过一个可以传递给onPreExecute()的布尔型参数来表示这一点,但是显然由于某种原因,onPreExecute()不接受任何参数。

显而易见的解决办法可能是在我的AsyncTask或外部类中创建一个成员字段,我必须在每次加载操作之前设置它,但这看起来并不是很优雅。有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

发布于 2015-09-30 23:43:02

为什么、如何以及哪些参数传递给Asynctask<>,请参见详细的here。我认为这是最好的解释。

谷歌的Android文档中写道:

异步任务由3个通用类型定义,分别称为参数、进度和结果,以及4个步骤,分别称为onPreExecute、doInBackground、onProgressUpdate和onPostExecute。

AsyncTask的泛型类型:

异步任务使用的三种类型如下:

Params,执行时发送给任务的参数类型。进度,后台计算过程中发布的进度单位的类型。结果,后台计算的结果的类型。并非所有类型都总是由异步任务使用。要将类型标记为未使用,只需使用类型Void:

代码语言:javascript
复制
 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

你可以进一步参考:http://developer.android.com/reference/android/os/AsyncTask.html

或者你可以通过参考Sankar-Ganesh的博客来明确AsyncTask的作用

一个典型的AsyncTask类的结构如下:

代码语言:javascript
复制
private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){ 

    } 

此方法在启动新的Thread之前执行。没有输入/输出值,所以只需初始化变量或您认为需要做的任何事情。

代码语言:javascript
复制
protected Z doInBackground(X...x){

}

AsyncTask类中最重要的方法。你必须把所有你想要做的事情放在后台,放在不同于主线程的线程中。这里我们有一个“X”类型的对象数组作为输入值(您在标题中看到了吗?我们有“...extends AsyncTask”,这些是输入参数的类型),并从类型“Z”返回一个对象。

protected void onProgressUpdate(Y y){

}此方法使用方法publishProgress(y)调用,通常在您想要在主屏幕中显示任何进度或信息时使用,如在后台显示操作进度的进度条。

protected void onPostExecute(Z z){

}此方法在后台操作完成后调用。作为输入参数,您将收到doInBackground方法的输出参数。

那么X、Y和Z类型呢?

从上面的结构可以推断出:

代码语言:javascript
复制
X – The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y – The type of the objects you are going to enter in the onProgressUpdate method.

 Z – The type of the result from the operations you have done in the background process.

如何从外部类调用此任务?只有以下两行:

代码语言:javascript
复制
MyTask myTask = new MyTask();

myTask.execute(x);

其中X是类型X的输入参数。

一旦我们的任务运行起来,我们就可以从“外部”找到它的状态。使用“getStatus()”方法。

myTask.getStatus();,我们可以收到以下状态:

正在运行-表示任务正在运行。

挂起-表示任务尚未执行。

已完成-指示onPostExecute(Z)已完成。

关于使用AsyncTask的提示

请勿手动调用onPreExecute、doInBackground和onPostExecute方法。这是由系统自动完成的。

不能在另一个AsyncTask或线程内部调用AsyncTask。方法execute的调用必须在UI线程中完成。

方法onPostExecute在UI中执行(在这里您可以调用另一个AsyncTask!)。

任务的输入参数可以是一个对象数组,这样你就可以放置任何你想要的对象和类型。

票数 11
EN

Stack Overflow用户

发布于 2017-12-28 06:21:54

您可以在任务构造函数中传递参数,也可以在调用execute时传递参数:

代码语言:javascript
复制
AsyncTask<Object, Void, MyTaskResult>

第一个参数(Object)在doInBackground中传递。第三个参数(MyTaskResult)由doInBackground返回。您可以将它们更改为所需的类型。这三个点表示零个或多个对象(或它们的数组)可以作为参数传递。

代码语言:javascript
复制
public class MyActivity extends AppCompatActivity {

    TextView textView1;
    TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);    
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);

        String input1 = "test";
        boolean input2 = true;
        int input3 = 100;
        long input4 = 100000000;

        new MyTask(input3, input4).execute(input1, input2);
    }

    private class MyTaskResult {
        String text1;
        String text2;
    }

    private class MyTask extends AsyncTask<Object, Void, MyTaskResult> {
        private String val1;
        private boolean val2;
        private int val3;
        private long val4;


        public MyTask(int in3, long in4) {
            this.val3 = in3;
            this.val4 = in4;

            // Do something ...
        }

        protected void onPreExecute() {
            // Do something ...
        }

        @Override
        protected MyTaskResult doInBackground(Object... params) {
            MyTaskResult res = new MyTaskResult();
            val1 = (String) params[0];
            val2 = (boolean) params[1];

            //Do some lengthy operation    
            res.text1 = RunProc1(val1);
            res.text2 = RunProc2(val2);

            return res;
        }

        @Override
        protected void onPostExecute(MyTaskResult res) {
            textView1.setText(res.text1);
            textView2.setText(res.text2);

        }
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3075009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档