与嵌套类的AsyncTask数据通信



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

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

我使用AsyncTask的http POST请求。
我有另一个类称为代理(不是一个好…将被更改),其中包含不同类型的功能(registerUser, setUserName, getUserPermission…)
当然,我有一个活动。

我的活动包含一个代理类的实例。我的目标是在活动中按下一个按钮,它将调用代理类中的一个方法,该方法反过来调用AsyncTask的execute()方法,该方法实际运行http POST。

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

我想到的是在AsyncTask中有一个接口,这将在代理类中实现,而代理类中的另一个接口将在我的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);
        }
    }

如果你只是需要HTTP POST功能,那么AsyncTask可能不是最好的选择。AsyncTask真的很亮,如果你需要得到的进度更新,因为任务正在执行(与onProgressUpdate(进度…进步)。如果你想使用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;
            }
        }
    };
}

我建议你试试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;
}
}

最新更新