android.os.NetworkOnMainThreadException 如何调整它在单独线程中运行的代码
android.os.NetworkOnMainThreadException how to adapt this code that it runs in a seperate thread
我正在开发一种软件,PC 和移动设备可以与服务器通信。当我 运行 来自 JAVA 桌面应用程序的代码时,它给了我以下错误
android.os.NetworkOnMainThreadException
我试图将我的 class 实现为一个线程,但我认为我没有做对。它仍然给我错误
如果有任何支持,我会很高兴。
class ServerAccessMobile 负责所有网络工作,它有两种 public 方法,一种用于从服务器获取数据,一种用于在服务器上设置数据
这就是我想从任何 Activity / Service
执行它的方式
ServerAccessMobile serverAccessMobile = new ServerAccessMobile();
ArrayList <String> dataFromServer = **serverAccessMobile.getDataFromServer()**;
ArrayList <String> dataToSend = .....
**serverAccessMobile.setDataOServer(dataToSend)**;
这是 class ServerAccessMobile
的代码
public class ServerAccessMobile {
// private variables
private ObjectOutputStream outputStream;
private ObjectInputStream inputStream;
...
// constructor
public ServerAccessMobile(String arg1)
{
...
}
**private ArrayList<String> run(ArrayList<String> messageToSendList)**
{
ArrayList <String> receivedMessageList = new ArrayList <String> ();
try // connect to server, get streams, process connection
{
connectToServer(); // create a Socket to make connection
getStreams(); // get the input and output streams
sendData(messageToSendList);
receivedMessageList = processConnection();
}
catch ( EOFException eofException )
{
System.out.println("\n terminated connection");
}
catch ( IOException ioException )
{
ioException.printStackTrace();
}
finally
{
closeConnection(); // close connection
}
return receivedMessageList;
}
public ArrayList <String > getDataFromServer(){
ArrayList< String > commandMessage = new ArrayList< String > ();
commandMessage.add("GETDATA");
ArrayList< String > receivedMessageList = new ArrayList< String > ();
// start server communication
receivedMessageList = **run(commandMessage);**
}
public void setDataOnServer(ArrayList <String> messageToSendList){
// start server communication
**run(messageToSendList);**
}
}
现在我的问题,
运行() 方法中的代码应该 运行 在单独的线程中,而不是 ui 线程中
我该如何正确实施?
谢谢你
您可以在以下link找到有关线程的详细说明:http://developer.android.com/guide/components/processes-and-threads.html#Threads
你可以这样做
new Thread(new Runnable() {
public void run() {
ServerAccessMobile serverAccessMobile = new ServerAccessMobile();
ArrayList <String> dataFromServer = **serverAccessMobile.getDataFromServer()**;
ArrayList <String> dataToSend = .....
serverAccessMobile.setDataOServer(dataToSend);
}
}).start();
如果您想从此线程更新 UI,则必须调用 view.post(Runnable) 方法。
我正在开发一种软件,PC 和移动设备可以与服务器通信。当我 运行 来自 JAVA 桌面应用程序的代码时,它给了我以下错误
android.os.NetworkOnMainThreadException
我试图将我的 class 实现为一个线程,但我认为我没有做对。它仍然给我错误
如果有任何支持,我会很高兴。
class ServerAccessMobile 负责所有网络工作,它有两种 public 方法,一种用于从服务器获取数据,一种用于在服务器上设置数据
这就是我想从任何 Activity / Service
执行它的方式ServerAccessMobile serverAccessMobile = new ServerAccessMobile();
ArrayList <String> dataFromServer = **serverAccessMobile.getDataFromServer()**;
ArrayList <String> dataToSend = .....
**serverAccessMobile.setDataOServer(dataToSend)**;
这是 class ServerAccessMobile
的代码public class ServerAccessMobile {
// private variables
private ObjectOutputStream outputStream;
private ObjectInputStream inputStream;
...
// constructor
public ServerAccessMobile(String arg1)
{
...
}
**private ArrayList<String> run(ArrayList<String> messageToSendList)**
{
ArrayList <String> receivedMessageList = new ArrayList <String> ();
try // connect to server, get streams, process connection
{
connectToServer(); // create a Socket to make connection
getStreams(); // get the input and output streams
sendData(messageToSendList);
receivedMessageList = processConnection();
}
catch ( EOFException eofException )
{
System.out.println("\n terminated connection");
}
catch ( IOException ioException )
{
ioException.printStackTrace();
}
finally
{
closeConnection(); // close connection
}
return receivedMessageList;
}
public ArrayList <String > getDataFromServer(){
ArrayList< String > commandMessage = new ArrayList< String > ();
commandMessage.add("GETDATA");
ArrayList< String > receivedMessageList = new ArrayList< String > ();
// start server communication
receivedMessageList = **run(commandMessage);**
}
public void setDataOnServer(ArrayList <String> messageToSendList){
// start server communication
**run(messageToSendList);**
}
}
现在我的问题,
运行() 方法中的代码应该 运行 在单独的线程中,而不是 ui 线程中 我该如何正确实施?
谢谢你
您可以在以下link找到有关线程的详细说明:http://developer.android.com/guide/components/processes-and-threads.html#Threads
你可以这样做
new Thread(new Runnable() {
public void run() {
ServerAccessMobile serverAccessMobile = new ServerAccessMobile();
ArrayList <String> dataFromServer = **serverAccessMobile.getDataFromServer()**;
ArrayList <String> dataToSend = .....
serverAccessMobile.setDataOServer(dataToSend);
}
}).start();
如果您想从此线程更新 UI,则必须调用 view.post(Runnable) 方法。