与嵌套的 AsyncTask 数据通信 类
AsyncTask data communication with nested Classes
我有一个特定的场景,我需要你的帮助。
我正在尝试在 Android 中构建一个涉及网络通信的应用程序。
我正在为 http POST 请求使用 AsyncTask。
我有另一个 class 叫做 Proxy(不是一个好东西..会被改变)它拥有不同种类的功能(registerUser、setUserName、getUserPermission...)
当然,我有一个 Activity.
我的 Activity 拥有 Proxy class 的一个实例。
我的目标是按下 activity 中的一个按钮,它会从 Proxy class 调用一个方法,后者又会调用 AsyncTask 的 execute() 方法,该方法实际上 运行 http POST.
我想知道如何从 AsyncTask 的 onPostExecute 获取数据到我的 activity。
我的想法是在 AsyncTask 中有一个接口,它将在 Proxy class 中实现,而 Proxy class 中的另一个接口将在我的 [=35= 中实现] class.
将数据一直滚动到我的 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);
}
}
我建议你试试 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;
}
}
如果您只需要 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;
}
}
};
}
我有一个特定的场景,我需要你的帮助。
我正在尝试在 Android 中构建一个涉及网络通信的应用程序。
我正在为 http POST 请求使用 AsyncTask。
我有另一个 class 叫做 Proxy(不是一个好东西..会被改变)它拥有不同种类的功能(registerUser、setUserName、getUserPermission...)
当然,我有一个 Activity.
我的 Activity 拥有 Proxy class 的一个实例。 我的目标是按下 activity 中的一个按钮,它会从 Proxy class 调用一个方法,后者又会调用 AsyncTask 的 execute() 方法,该方法实际上 运行 http POST.
我想知道如何从 AsyncTask 的 onPostExecute 获取数据到我的 activity。
我的想法是在 AsyncTask 中有一个接口,它将在 Proxy class 中实现,而 Proxy class 中的另一个接口将在我的 [=35= 中实现] class.
将数据一直滚动到我的 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);
}
}
我建议你试试 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;
}
}
如果您只需要 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;
}
}
};
}