我试图将日期从客户端的Android
应用程序发送到服务器端的桌面NetBeans
应用程序,连接工作正常,即使发送数据,但是在我将Android IDE
更新到版本3之前!
现在,当我尝试发送数据时,出现以下异常:
android.os.NetworkOnMainThreadException
现在我看到这里的帖子是Stackoverflow ... this one,我明白这是因为发送数据发生在主线程上,但是我没有使用主线程来发送数据,并且每次尝试发送数据时,我仍然会收到此错误。
代码说明:我有两种发送数据的方法,一种方法是在建立连接后仅发送一次数据,第二种方法是随时发送数据,现在是我的第一手方法。在主线程上,但是第二个在另一个线程上,例外情况永远不会在第一个线程上发生,但是它总是会在第二个线程上发生,我听说一个解决方案是使用AsyncTask
并且我'v在第二个上使用了它,现在我大部分时间都得到了惊喜,但并非总是如此。
这是我的代码,用于更好地理解:
这是第一个仅在主线程上运行一次的方法,它将始终有效:
private void SendInformation(){
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(android.os.Build.MODEL);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
}
}
这是我的第二个带有线程的东西,这个总是给出例外:
public static void SendDetails(String S1, String S2){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(S1 + "," + S2);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
MainActivity.ErrorMessage.setText(e.toString());
}
}
}, Delay * 1000);
}
这是一次相同的秒,但是使用AsyncTask
:
private static SendInfoTask SIT = new SendInfoTask();
public static void SendDetails(String S1, String S2){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
SIT.execute();
}
}, Delay * 1000);
}
static class SendInfoTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(Client.AppName + "," + Client.NotificationText);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
MainActivity.ErrorMessage.setText(e.toString());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
有时它可以工作,有时不起作用,当它尝试发送5次后整个应用程序崩溃时,它确实可以工作!
有人可以帮助我吗?什么是我要做的最佳实践? (感谢您的帮助)