Java 使用AsyncTask避免AndroidNetworkOnMainThreadException时遇到的挑战

Java 使用AsyncTask避免AndroidNetworkOnMainThreadException时遇到的挑战,java,android,android-asynctask,gson,Java,Android,Android Asynctask,Gson,我试图使用gson连接到服务器,但代码有问题,我发现网络连接需要AsyncTask,因为它不会在主线程中运行,因此出现了标题中所述的异常 public class SendPostRequest extends AsyncTask<String, Void, String> { private Gson gson = new GsonBuilder().create(); public String sendMessage(Object message, Str

我试图使用gson连接到服务器,但代码有问题,我发现网络连接需要AsyncTask,因为它不会在主线程中运行,因此出现了标题中所述的异常

public class SendPostRequest extends AsyncTask<String, Void, String>  {

   private Gson gson = new GsonBuilder().create();



   public String sendMessage(Object message, String address) {

       String url = "http://192.168.87.108:8080/MSS/" + address;
       String data = gson.toJson(message);
       HttpPost post = new HttpPost(url);



       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
       nameValuePairs.add(new BasicNameValuePair("report", data));

       try {
           post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
       } catch (UnsupportedEncodingException e) {
           System.out.println("Your url encoding is shiat fail");
           e.printStackTrace();
       }



       HttpClient client = new DefaultHttpClient();
       HttpResponse response = null;
       try {
           response = client.execute(post);
       } catch (ClientProtocolException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       HttpEntity entity = response.getEntity();

       String responseText = "";
       try {
           responseText = EntityUtils.toString(entity);
       } catch (ParseException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       return responseText;
   }

   @Override
   protected String doInBackground(String... params) {
      return "";
   }

 }
公共类SendPostRequest扩展了异步任务{
private Gson Gson=new GsonBuilder().create();
公共字符串sendMessage(对象消息,字符串地址){
字符串url=”http://192.168.87.108:8080/MSS/“+地址;
String data=gson.toJson(消息);
HttpPost=新的HttpPost(url);
List nameValuePairs=新的ArrayList(1);
添加(新的BasicNameValuePair(“报告”,数据));
试一试{
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
}捕获(不支持的编码异常e){
System.out.println(“您的url编码失败”);
e、 printStackTrace();
}
HttpClient=new DefaultHttpClient();
HttpResponse响应=null;
试一试{
响应=client.execute(post);
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
HttpEntity=response.getEntity();
字符串responseText=“”;
试一试{
responseText=EntityUtils.toString(实体);
}捕获(解析异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回响应文本;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
}

我知道我需要将代码移动到doInBackground方法中,但我还需要通过在其他类中调用SendMessage方法来使用其参数,以与服务器参数(如save、register等)相对应,因此我不确定如何移动内容,使其作为异步任务工作。如果您有任何帮助,我们将不胜感激,谢谢您

AsyncTask
接受一种类型的参数,
String
,在您的情况下,因此我将
sendMessage
方法改为接受
字符串数据
,而不是
对象消息
(因此,您只需在执行任务之前将
对象消息
转换为JSON字符串,它不涉及网络,也不会非常耗时):

数据
地址
传递到
执行
方法。
数据
随后将映射到
参数[0]
地址
参数[1]
并可从
doInBackground
方法访问。
params
变量只是传递给
execute
方法的所有参数的数组


在这种情况下,
data
address
都必须是
String
,因为它是
AsyncTask

中声明的类型,基于我认为我第一次收单是当天的dupe。您应该可以在doInBackground()中调用sendMessage函数。最好是在PreExecute中创建要发送的消息,然后在doInBackground中发送,这样在生成参数时要使用的类周围就不会出现同步错误。但我认为要提供更多帮助,您需要更具体地说明问题所在。谢谢,这帮助了lot,但我在这行代码中遇到了这个问题:
Area[]og=gson.fromJson(request.execute(msg,“synch”),Area[].class);
如何以我需要的格式获取返回数据,它给了我这个错误:
gson类型中的fromJson(String,class)方法不适用于参数(AsyncTask,class)
@AlexandruPatriche若要对任务结果进行处理,您必须使用
onPostExecute
方法。我已编辑了我的答案并添加了此方法。此外,如果答案对您有帮助,您可以单击计票下的复选标记接受该方法。
public class SendPostRequest extends AsyncTask<String, Void, String> {
    public String sendMessage(String data, String address) {
        [..]
    }   

    @Override
    protected String doInBackground(String... params) {
        return sendMessage(params[0], params[1]);
    }

    @Override
    protected void onPostExecute(String result) {
        Area[] og = gson.fromJson(result, Area[].class);
    }
}
new SendPostRequest().execute(data, address);