Android 对REST请求重用HttpUrlConnection和AsynTask
我有PostData类来将数据Android 对REST请求重用HttpUrlConnection和AsynTask,android,rest,android-asynctask,Android,Rest,Android Asynctask,我有PostData类来将数据lat、long、mac、…传输到从服务类发送给它的服务器。在PostData类中,数据在AsyncTask和HttpURLConnection的帮助下进行处理 现在我有了一个新的活动,用户可以在其中向服务器发送查询。要达到这一点,我必须从服务器获取ArrayList,并创建一个类似于复选框的列表,用户可以在其中选择所需的项目,然后将数据发送到服务器以检索结果 我是否可以实现一个新的Asyntask和HttpURLConnection来实现这一点,或者我必须在POs
lat、long、mac、…
传输到从服务类发送给它的服务器。在PostData类中,数据在AsyncTask
和HttpURLConnection
的帮助下进行处理
现在我有了一个新的活动,用户可以在其中向服务器发送查询。要达到这一点,我必须从服务器获取ArrayList
,并创建一个类似于复选框的列表,用户可以在其中选择所需的项目,然后将数据发送到服务器以检索结果
我是否可以实现一个新的Asyntask
和HttpURLConnection
来实现这一点,或者我必须在POstData
类中使用我的Asyntask
和HttpURLConnection
谢谢你的帮助
我的PostData类:
public class PostData {
String jSONString;
private AsyncTaskCallback callback;
public PostData(AsyncTaskCallback callback) {
this.callback = callback;
}
public String getjSONString() {
return jSONString;
}
public void setjSONString(String jSONString) {
this.jSONString = jSONString;
}
public void post_data(String jSONString, Context context) {
this.jSONString = jSONString;
new MyAsyncTask(context).execute(jSONString);
}
class MyAsyncTask extends AsyncTask<String, Integer, ArrayList<Integer>> {
final Context mContext;
ArrayList<Integer> routes = new ArrayList<Integer>();
double distance;
public MyAsyncTask(Context context) {
mContext = context;
}
@Override
protected ArrayList<Integer> doInBackground(String... params) {
BufferedReader reader = null;
try {
URL myUrl = new URL(
"https://bustracker.rhcloud.com/webapi/test");
HttpURLConnection conn = (HttpURLConnection) myUrl
.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setRequestProperty("Content-Type", "application/json");
conn.connect();
DataOutputStream wr = new DataOutputStream(
conn.getOutputStream());
wr.writeBytes(params[0]);
wr.close();
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
Gson gson = new Gson();
StopsJSON data = gson.fromJson(sb.toString(), StopsJSON.class);
routes = data.getRoutes();
distance = data.getDistance();
System.out.println("The output of the StringBulder: "
+ sb.toString());
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (reader != null) {
try {
reader.close();
return null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
protected void onPostExecute(ArrayList<Integer> result) {
if (routes != null && !routes.isEmpty()) {
callback.onAsyncTaskFinished(routes, distance);
}else{
Log.e("123", "Avoiding null pointer, the routes are null!!!");
}
}
}
}
公共类PostData{
字符串jSONString;
私有异步任务回调;
公共PostData(AsyncTaskCallback){
this.callback=回调;
}
公共字符串getjSONString(){
返回jSONString;
}
public void setjSONString(字符串jSONString){
this.jSONString=jSONString;
}
public void post_数据(字符串jSONString,上下文){
this.jSONString=jSONString;
新建MyAsyncTask(context).execute(jSONString);
}
类MyAsyncTask扩展了AsyncTask{
最终语境;
ArrayList routes=新建ArrayList();
双倍距离;
公共MyAsyncTask(上下文){
mContext=上下文;
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
BufferedReader reader=null;
试一试{
URL myUrl=新URL(
"https://bustracker.rhcloud.com/webapi/test");
HttpURLConnection conn=(HttpURLConnection)myUrl
.openConnection();
conn.setRequestMethod(“POST”);
连接设置输出(真);
连接设置连接超时(10000);
连接设置读取超时(10000);
conn.setRequestProperty(“内容类型”、“应用程序/json”);
连接();
DataOutputStream wr=新的DataOutputStream(
conn.getOutputStream());
wr.writeBytes(参数[0]);
wr.close();
StringBuilder sb=新的StringBuilder();
reader=新的BufferedReader(新的InputStreamReader(
conn.getInputStream());
弦线;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
Gson Gson=新的Gson();
StopsJSON data=gson.fromJson(sb.toString(),StopsJSON.class);
routes=data.getRoutes();
距离=数据。getDistance();
System.out.println(“StringBulder的输出:”
+某人扭动绳子;
}捕获(IOE异常){
e、 printStackTrace();
返回null;
}最后{
if(读卡器!=null){
试一试{
reader.close();
返回null;
}捕获(例外e){
e、 printStackTrace();
}
}
}
返回null;
}
受保护的void onPostExecute(ArrayList结果){
if(routes!=null&!routes.isEmpty()){
callback.onAsyncTaskFinished(路线、距离);
}否则{
Log.e(“123”,“避免空指针,路由为空!!!”;
}
}
}
}
这可能会让您走上一些代码重构的道路,但对于REST请求的一般良好实践,您应该研究一下,或者(还有可能有帮助的改进)
这些库在性能方面非常高效,从长远来看,它们会为您节省很多麻烦,它们负责后台线程,您不必显式使用HttpUrlConnection
希望这有帮助
编辑:
为了进一步回答您的问题-如果您确实希望专门使用AsyncTask-您应该使用PostData类作为通用类,在您的网络操作中(可能还希望将其设置为单例,并给它一个更通用的名称)
是的,您的实现看起来应该能够使用它,任何更正\更改\添加都应该在AsyncTask本身的PostData下进行,不需要另一个常规类,如果需要的话-您可以添加更多的内部AsyncTask子类
我(非常笼统)的方向是:
public class NetworkData {
String jSONString;
private AsyncTaskCallback callback;
public NetworkData(AsyncTaskCallback callback) {
this.callback = callback;
}
public String getjSONString() {
return jSONString;
}
public void setjSONString(String jSONString) {
this.jSONString = jSONString;
}
//let's say this is for post requests...
public void postData(String jSONString, Context context) {
this.jSONString = jSONString;
new MyPostTask(context).execute(jSONString);
}
//let's say this is for get requests...
public void getData(String jSONString, Context context) {
this.jSONString = jSONString;
new MyGetTask(context).execute(jSONString);
}
class MyPostTask extends AsyncTask<String, Integer, ArrayList<Integer>> {
final Context mContext;
ArrayList<Integer> routes = new ArrayList<Integer>();
double distance;
public MyPostTask(Context context) {
mContext = context;
}
@Override
protected ArrayList<Integer> doInBackground(String... params)
{
try
{
//do you stuff for post requests...
} catch (IOException e)
{
//...
}
finally
{
//...
}
}
}
class MyGetTask extends AsyncTask<String, Void, ArrayList<Object>> {
final Context mContext;
ArrayList<Object> routes = new ArrayList<Object>();
public MyPostTask(Context context) {
mContext = context;
}
@Override
protected ArrayList<Object> doInBackground(String... params)
{
try
{
//do you stuff for get requests...
}
catch (IOException e)
{
//...
}
finally
{
//...
}
}
}
}
公共类网络数据{
字符串jSONString;
私有异步任务回调;
公用网络数据(AsyncTaskCallback){
this.callback=回调;
}
公共字符串getjSONString(){
返回jSONString;
}
public void setjSONString(字符串jSONString){
this.jSONString=jSONString;
}
//假设这是用于post请求。。。
公共void postData(字符串jSONString,上下文){
this.jSONString=jSONString;
新建MyPostTask(context).execute(jSONString);
}
//假设这是用于获取请求的。。。
public void getData(字符串jSONString,上下文){
this.jSONString=jSONString;
新建MyGetTask(context.execute(jSONString);
}
类MyPostTask扩展了AsyncTask{
最终语境;
ArrayList routes=新建ArrayList();
双倍距离;
公共MyPostTask(上下文){
mContext=上下文;
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数)
{
尝试
{
//你有没有关于发帖要求的东西。。。
}捕获(IOE异常)
{