Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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
Java 如何将函数作为参数传递给AsynTask_Java_Android_Android Asynctask - Fatal编程技术网

Java 如何将函数作为参数传递给AsynTask

Java 如何将函数作为参数传递给AsynTask,java,android,android-asynctask,Java,Android,Android Asynctask,因为我是android开发中的新手,所以我需要为我的http请求提供一个asynctask类。我在一个活动中有很多http请求函数类型,我想让它成为动态的。所以我只想创建一个AsyncTask函数来运行我所有的函数 这就是一个例子 private class WebServiceCall extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { g

因为我是android开发中的新手,所以我需要为我的http请求提供一个asynctask类。我在一个活动中有很多http请求函数类型,我想让它成为动态的。所以我只想创建一个AsyncTask函数来运行我所有的函数

这就是一个例子

  private class WebServiceCall extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        pBar.setVisibility(View.VISIBLE);
        pBar.setIndeterminate(false);
        pBar.setClickable(false);
    }
    @Override
    protected Void doInBackground(Void... params) {
        // a function that i passed
       Function01();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        try{
         some code
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        pBar.setClickable(true);
        pBar.setVisibility(View.GONE);
    }

}
)

任何帮助和代码示例都将不胜感激,
谢谢

在AsyncTask中用函数发送类对象并从对象调用函数

public class A
{
//your function
int function()
{
return...;
}
}

private class WebServiceCall extends AsyncTask<Void, Void, Void> {
    A myobj;
    WebServiceCall(A mycustomslass)
    {
         myobj = mycustomclass;
    }
    @Override
    protected void onPreExecute() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        pBar.setVisibility(View.VISIBLE);
        pBar.setIndeterminate(false);
        pBar.setClickable(false);
    }
    @Override
    protected Void doInBackground(Void... params) {
        // a function that i passed

        int cur = myobj.function();//this your function
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        try{
         some code
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        pBar.setClickable(true);
        pBar.setVisibility(View.GONE);
    }

}

我不知道你所说的
函数
作为另一个函数的参数是什么意思

但是您可以使用
接口
实现此目的

例如:

创建可在
onPostExecute()中调用的回调接口

在调用asynckTask之前,请按如下方式定义它:

   ResponseCallback callback = new ResponseCallback() {
            @Override
            public void onRespond() {
              //code to be done after calling it from onPostExecute
            }
        };
并将
回调
传递给
异步任务的
构造函数
,并在
onPostExecute中调用它

public interface ResponseCallback {

    void onRespond();
}


当然,您可以根据自己的需要修改
接口的签名。

这并不能直接解决您的问题,但我敦促您调查使用AsyncTask处理任何可能需要几毫秒以上时间的事情时出现的相当明显的问题,还有几个非常好的Android HTTP/REST框架,例如改型。

最好添加一个接受回调的构造函数。然后您可以实例化并像调用新的WebServiceCall(function01)一样调用它;可以显示代码示例吗?谷歌为如何实现回调。但我想知道你为什么想要这个。如果asynctask是活动中的私有类,那么您可以调用该活动中定义的每个函数。那么您的用例是什么呢?您能展示代码示例吗?还是简单地修改了我的代码?我想调用DoInbackground,因为这是一个繁重的过程。可能吗?接口中的方法可以在任何地方调用(当然,如果接口变量不是null),但这都与代码逻辑有关!我自己从来不用在
doInBackground
中调用回调!
public interface ResponseCallback {

    void onRespond();
}
   ResponseCallback callback = new ResponseCallback() {
            @Override
            public void onRespond() {
              //code to be done after calling it from onPostExecute
            }
        };