Android 异步任务返回结果

Android 异步任务返回结果,android,android-asynctask,Android,Android Asynctask,我目前在从从JSON连接获取数据的AsyncTask中获取值时遇到问题。我看了几个例子,但大多数情况下,我只看到发布AsyncTask的结果 首先,我有一个名为Dog的对象,它只有一个字符串,Name。我正试图从服务器上获取狗的名字。 在oncreate中使用以下代码,我启动DogAsyncTask,同时输入一个名为n的URL和一个Dog d_in Dog d_in = new Dog("DogName"); DogAsyncTask task = new DogAsyncTas

我目前在从从JSON连接获取数据的AsyncTask中获取值时遇到问题。我看了几个例子,但大多数情况下,我只看到发布AsyncTask的结果

首先,我有一个名为Dog的对象,它只有一个字符串,Name。我正试图从服务器上获取狗的名字。 在oncreate中使用以下代码,我启动DogAsyncTask,同时输入一个名为n的URL和一个Dog d_in

    Dog d_in = new Dog("DogName");
    DogAsyncTask task = new DogAsyncTask(d_in);
    String n = "www.dog.com";
    task.execute(n);
    Log.e("Out", d_in.getName());
我的任务如下:

 private class DogAsyncTask extends AsyncTask<String, Void, String> {

    Dog d = null;

    DogAsyncTask(Dog d){
        this.d = d;
    }

    ProgressDialog mProgressDialog;
    @Override
    protected void onPostExecute(String result) {
        d.setName(result);
        Log.e("Dog", d.getName());
        mProgressDialog.dismiss();
    }

    @Override
    protected void onPreExecute() {
        mProgressDialog = ProgressDialog.show(AsyncTestActivity.this, "Loading...", "Data is Loading...");
    }

    @Override
    protected String doInBackground(String... name) {
        //Go to url = name and then gets String below.
        String outfromjson = "new dog name";  //This will be a function that gets a name from JSON
        return outfromjson;
    }
}
私有类DogAsyncTask扩展了AsyncTask{
狗d=null;
狗异步任务(狗d){
这个。d=d;
}
进程对话框;
@凌驾
受保护的void onPostExecute(字符串结果){
d、 集合名(结果);
Log.e(“Dog”,d.getName());
mProgressDialog.disclose();
}
@凌驾
受保护的void onPreExecute(){
mProgressDialog=ProgressDialog.show(AsyncTestActivity.this,“正在加载…”,数据正在加载…”);
}
@凌驾
受保护的字符串doInBackground(字符串…名称){
//转到url=name,然后获取下面的字符串。
String outfromjson=“new dog name”;//这将是一个从JSON获取名称的函数
返回输出JSON;
}
}
我试过用类似的东西 Log.e(“Out”,task.d.getName());
但我一直得到狗的默认名称,即“DogName”。如何执行AsyncTask中的值?

您可以执行以下操作


在活动中声明并实现一个接口,然后将其方法用作onPostExecute方法的回调。

好的,这里发生的事情是:

您想通过<代码>狗>代码>作为参考(<代码>指针< /代码>,如C/C++ + ObjuleC), 您希望使用其他变量反映原始变量中的更改

但请记住,Java不是通过引用传递对象,而是通过值传递对象(只传递值,创建另一个对象并分配值)


因此,您可以做的是将结果持有者对象再次指定为原始对象的值。

yes;Log.e(“Dog”,d.getName())将dogname显示为“new Dog name”谢谢您的帮助Adil,我之前读过它时不理解您的响应,但尝试后效果很好。您知道如何从新的DataDownloadListener()中获取结果(对象数据)吗?正如我实现的那样,我将数据传递给
listener.downloaded成功(数据)
在实现中,我在注释了处理程序结果的地方得到了数据,您可以在那里得到结果:)我仍然有点困惑。在我的活动中,在最后一行:getdata.execute(“”)之后;,我想返回数据;在函数外,如何从DataDownloaded成功获取对象数据(对象数据)并向外返回?您可以将该对象数据设置为任何类级别变量。或者,您可以将文本设置为任何文本视图,或者根据需要进行操作。甚至我们也可以使用自己的接口从asyncTask获取返回值。我刚刚在我的博客上发布了同样的例子。您可以在下面的链接中引用示例代码。[