【问题标题】:AsyncTask data communication with nested Classes与嵌套类的 AsyncTask 数据通信
【发布时间】:2015-05-28 23:46:35
【问题描述】:

我有一个特定的场景,我需要你的帮助。

我正在尝试在 Android 中构建一个涉及网络通信的应用程序。

我正在为 http POST 请求使用 AsyncTask。
我有另一个名为 Proxy 的类(不是一个好的 .. 将被更改),它拥有不同类型的功能(registerUser、setUserName、getUserPermission...)
当然,我有一个 Activity。

我的 Activity 拥有一个 Proxy 类的实例。 我的目标是在活动中按下一个按钮,它将调用 Proxy 类中的一个方法,该方法又调用实际运行 http POST 的 AsyncTask 的 execute() 方法。

我想知道如何从 AsyncTask 的 onPostExecute 获取数据到我的活动。

我的想法是在 AsyncTask 中有一个接口,它将在 Proxy 类中实现,而 Proxy 类中的另一个接口将在我的 Activity 类中实现。

将数据一直滚动到我的 Activity。

我想听听您对这是要走的路还是首选其他方法的想法。

非常感谢您的帮助。
添加一些代码

public class RegisterActivity extends FragmentActivity implements Proxy.OnProxyHttpPostResponseListener {

private Proxy proxy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        this.proxy = new Proxy();
        this.proxy.setHttpPostResponseListener(this);
    }

   @Override
   public void onProxyHttpPostResponse(String response) {
       //Do something when http post returns
   }
}


public class Proxy {

    public interface OnProxyHttpPostResponseListener {
        void onProxyHttpPostResponse(String response);
    }
    private OnProxyHttpPostResponseListener httpPostResponseListener;

    public void setHttpPostResponseListener(OnProxyHttpPostResponseListener listener) {
        this.httpPostResponseListener = listener;
    }


    private class HttpPostAsync extends AsyncTask<Pair<String, ArrayList<Pair<String, String>>>, Void, String> {

        @Override
        protected String doInBackground(Pair<String, ArrayList<Pair<String, String>>>... params) {
            return this.httpPost(params[0].first, params[0].second);
        }

        protected void onPostExecute(String response) {
            httpPostResponseListener.onProxyHttpPostResponse(response);
        }
    }

【问题讨论】:

  • 如果可能,您能否向我们展示您现在拥有的任何代码,以帮助我们更好地理解您的问题? :)

标签: java android android-activity android-asynctask http-post


【解决方案1】:

如果您只需要 HTTP POST 功能,那么 AsyncTask 可能不是最佳选择。如果您需要在任务执行时获取进度更新(使用 onProgressUpdate(Progress...progress)),AsyncTask 真的很出色。如果您仍然想使用 AsyncTask,iroiroys 的回复应该会有所帮助。

更简单一点,您可以直接使用 Handler 线程。像这样的:

public class HandlerExampleActivity extends Activity {
    private Button postButton;
    private Button getButton;

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

        backgroundThread = new BackgroundThread();
        backgroundThread.start();

        postButton = (Button) findViewById(R.id.button_post);
        postbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                backgroundThread.post("DATA_HERE");
            }
        });
        getButton = (Button) findViewById(R.id.button_get);
        getbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                backgroundThread.get("URL_HERE");
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        backgroundThread.exit();
    }

    private class BackgroundThread extends Thread {
        private Handler backgroundHandler;

        public void run() {
            Looper.prepare();
            backgroundHandler = new Handler();
            Looper.loop();
        }

        public void post(DataType data) {
            backgroundHandler.post(new Runnable() {
                @Override
                public void run() {
                    // pull data and do the POST

                    uiMsg = uiHandler.obtainMessage(POST_COMPLETE, whatever_data_passing_back, 0, null);
                    uiHandler.sendMessage(uiMsg);
                }
            });
        }

        public void get(URL data) {
            backgroundHandler.post(new Runnable() {
                @Override
                public void run() {
                    // GET data

                    uiMsg = uiHandler.obtainMessage(GET_COMPLETE, whatever_data_passing_back, 0, null);
                    uiHandler.sendMessage(uiMsg);
                }
            });
        }

        public void exit() {
            backgroundHandler.getLooper().quit();
        }
    }

    private final Handler uiHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case POST_COMPLETE:
                    // handle it
                    break;
                case GET_COMPLETE:
                    // handle it
                    break
                case MESSAGE_BACK_TO_UI_THREAD:
                    // do something
                    break;
                case OPERATION_FAIL:
                    // oh no!
                    break;
                case OPERATION_SUCCESS:
                    // yay!
                    break;
            }
        }
    };
}

【讨论】:

  • 您好,感谢您的回答。不仅仅是 Http POST,它也是 GET。我的目标是创建一个封装我所有服务器需求的类。获取数据和发布数据,封装在“registerUser、deleteUser、getuserData”等方法中……
  • 没问题。我建议在 Message 的 what 字段中使用不同的整数,然后基于它执行功能。您可以在 obj 字段中发送数据。更新示例。
【解决方案2】:

我建议你试试 Handler 和 Handler.Callback。

下面我做了个简单的例子..

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;

public class MainActivity extends Activity implements Callback {

Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    handler = new Handler(this);
    Proxy proxy = new Proxy(handler);
    proxy.foo();
}

private class Proxy {

    Handler handler;

    public Proxy(Handler handler) {
        this.handler = handler;
    }

    private void foo() {
        new myAsync().execute();
    }

    private class myAsync extends AsyncTask<Void, Void, Void> {

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

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Message msg = handler.obtainMessage();
            msg.obj = result;
            handler.sendMessage(msg);
        }

    }
}

@Override
public boolean handleMessage(Message msg) {
    // Handle Message here!
    return false;
}
}

【讨论】:

  • 您好,感谢您的回答。我正在尝试创建一个“代理”类,该类将具有可能一起运行的多个方法。处理程序仍然是正确的选择吗?我将有多个 AsyncTask 对象,它们使用相同的处理程序...
  • 我添加了一些代码。这有点类似于 Handler 的东西,但是通过接口我可以定义更多的方法来处理不同类型的操作。你怎么看?
  • 好吧,我只实现了“一个”接口,但是,您也可以添加更多要执行的代理类,只需添加更多匿名实例。另外,如果您想按顺序运行,请添加在“handleMessage”中。对不起,我的英语很短:(
  • 我已将此答案标记为答案,因为它确实有效 - 但这并不是我真正想要的。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2019-10-29
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多