Java 使用AsyncTask避免AndroidNetworkOnMainThreadException时遇到的挑战
我试图使用gson连接到服务器,但代码有问题,我发现网络连接需要AsyncTask,因为它不会在主线程中运行,因此出现了标题中所述的异常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
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);