Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 活动与异步任务冲突?如何在GUI中实现异步任务?_Java_Android_Android Asynctask - Fatal编程技术网

Java 活动与异步任务冲突?如何在GUI中实现异步任务?

Java 活动与异步任务冲突?如何在GUI中实现异步任务?,java,android,android-asynctask,Java,Android,Android Asynctask,我为我糟糕的英语技能感到抱歉。我不熟悉编程/stackoverflow,并尝试创建一个android小测验应用程序。此应用程序必须连接到php服务器并登录/getquestion 最简单的例子是登录。用户必须输入数据,然后我必须连接。 为了保证Gui不会冻结,我必须使用异步任务 以下是活动代码: public void login(final String username, final String password) { final Activity a = this;

我为我糟糕的英语技能感到抱歉。我不熟悉编程/stackoverflow,并尝试创建一个android小测验应用程序。此应用程序必须连接到php服务器并登录/getquestion

最简单的例子是登录。用户必须输入数据,然后我必须连接。 为了保证Gui不会冻结,我必须使用异步任务

以下是活动代码:

 public void login(final String username, final String password) {
     final Activity a = this;
     FutureTask t = new FutureTask(new Callable() {
         public Object call() {
             Connection.GetInstance(a).login(username,password);
             afterLoginTry(username,password);
             return null;
         }
     });
     t.run();
 }
这将调用另一个类中的方法,该类调用另一个
FutureTask
,该类调用
AsyncTask
。最后总是有一个公共同步方法,例如
afterlogintry()
。这是可行的,但速度有点慢,而且我认为代码很脏

我的主要问题是,我不知道如何通过不同的类层返回结果,尤其是在不始终使用修补程序的情况下返回活动

有没有什么好的解释或教程来描述如何设计这样的结构


Thx for help

异步任务
结果传递回其他类的方法是声明该任务的回调,然后将结果报告给侦听器。下面是它的工作原理

首先,必须在
AsyncTask
中声明一个接口,该接口包含一个将发送任务结果的方法。在下面的示例任务中,我的结果是一个字符串。当任务完成其工作时,字符串被传递到
onPostExecute()
。然后,我在注册的侦听器上调用回调方法,并将该返回值传递给正在侦听它的人。通过传入创建任务的任何类的回调实例来注册侦听器

public class MyTask extends AsyncTask<String, Void, String> {

    MyTaskCallback listener;

    public MyTask(MyTaskCallback listener) {
        this.listener = listener;
    }

    protected String doInBackground(String... params) {
        String input = params[0];

        //do work
        input += "did some work on this String";

        return input;
    }

    //When the thread finishes its work, this gets
    //called on the main UI thread
    protected void onPostExecute(String result) {
        listener.onResultReceived(result);
    }

    public interface MyTaskCallback {
        void onResultReceived(String result);
    }
} 
现在,我们的任务通过传入的回调将我们的活动连接到它。现在,当我们的任务得到一个结果时,我们可以直接将它发送给我们的侦听器,这是我们的活动,结果将直接发送到我们实现的
onResultReceived
方法

回调是在类之间传递信息的一种很好的方式,同时还可以使所有内容保持非常分离。希望这有帮助

public class TaskActivity extends AppCompatActivity implements MyTask.MyTaskCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        //we pass in "this" because our Activity itself
        //implements the callbacks below.
        MyTask myTask = new MyTask(this);
        myTask.execute();
    }

    //Here we implement our callback method, so the task
    //can send its results straight through here
    public void onResultReceived(String theResult) {
        Log.d("TASK RESULT", "Here is our result String: "+theResult);
    }

}