如何将 AsyncTask 与插入返回所需的 urlconnection 一起使用



我想使用AsyncTask与服务器连接,但ondoInBackground出现错误。该错误需要java.lang.string那么我该如何改进Update()中的代码?如何在Update()方法中插入"返回"?

public void Update(final String urlString){
    new Thread(new Runnable() {
        public void run() {
            try {
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.connect();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
                writer.write("name=abc");
                writer.close();
                int responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    StringBuilder stringBuilder = new StringBuilder();
                    String line;
                    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                    while ((line = br.readLine()) != null) {
                        stringBuilder .append(line);
                    }
                     String result = stringBuilder .toString();
                }
            } catch (Exception e) {
                e.printStackTrace();        
            }
        }
    }).start();
}
public class MyAsyncTask extends AsyncTask<String,Void,String> {
    @Override
    protected void onPreExecute(){
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String...url) {
        return Update(url[0]);
    }
    @Override
    protected void onPostExecute(String result){
        Log.d("TAG", result);
    }
}

如何将AsyncTask与需要插入返回的url连接一起使用

您需要在 Update() 方法中返回一个字符串

也无需在Update()方法中使用其他Thread,因为AsyncTask已经在后台运行

示例代码

 public String Update(final String urlString){
        String result="";
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.connect();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
            writer.write("name=abc");
            writer.close();
            int responseCode = connection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                InputStream inputStream = connection.getInputStream();
                StringBuilder stringBuilder = new StringBuilder();
                String line;
                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                while ((line = br.readLine()) != null) {
                    stringBuilder .append(line);
                }
                result = stringBuilder .toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public class MyAsyncTask extends AsyncTask<String,String,String> {
        @Override
        protected void onPreExecute(){
            super.onPreExecute();
        }
        @Override
        protected String doInBackground(String...url) {
            return Update(url[0]);
        }
        @Override
        protected void onPostExecute(String result){
            Log.d("TAG", result);
        }
    }

使用以下代码启动 AsyncTask:

MyAsyncTask task = new MyAsyncTask();
task.execute(URL);

注意:使用 AsyncTask 时,您不应该在 Update(URL) 方法中创建新的线程

extends AsyncTask<String,Void,String>

这里的字符串意味着 AsynkTask 在返回中等待字符串类型。

protected String doInBackground(String...url) {
    return Update(url[0]);
}

已经在单独的线程中。只需从方法中删除它即可。

不要使用 AsynkTask 与服务器连接。(这是活动生命周期不稳定的事情)

最新更新