Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对REST请求重用HttpUrlConnection和AsynTask_Android_Rest_Android Asynctask - Fatal编程技术网

Android 对REST请求重用HttpUrlConnection和AsynTask

Android 对REST请求重用HttpUrlConnection和AsynTask,android,rest,android-asynctask,Android,Rest,Android Asynctask,我有PostData类来将数据lat、long、mac、…传输到从服务类发送给它的服务器。在PostData类中,数据在AsyncTask和HttpURLConnection的帮助下进行处理 现在我有了一个新的活动,用户可以在其中向服务器发送查询。要达到这一点,我必须从服务器获取ArrayList,并创建一个类似于复选框的列表,用户可以在其中选择所需的项目,然后将数据发送到服务器以检索结果 我是否可以实现一个新的Asyntask和HttpURLConnection来实现这一点,或者我必须在POs

我有PostData类来将数据
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异常)
{