繁体   English   中英

android.os.NetworkOnMainThreadException如何修改在单独线程中运行的这段代码

[英]android.os.NetworkOnMainThreadException how to adapt this code that it runs in a seperate thread

我正在开发一种软​​件,其中PC和移动设备与服务器通信。 当我从JAVA桌面应用程序运行代码时,它给了我以下错误android.os.NetworkOnMainThreadException

我试图将我的课程实现为线程,但我认为我做得不好。 它仍然给我错误

我会很高兴得到任何支持。

ServerAccessMobile类负责所有的联网工作,并具有两个公共方法,一个用于从服务器获取数据,另一个用于在服务器上设置数据。

这就是我想从任何活动/服务中执行它的方式

ServerAccessMobile serverAccessMobile = new ServerAccessMobile();
ArrayList <String> dataFromServer = **serverAccessMobile.getDataFromServer()**;

ArrayList <String> dataToSend = .....

**serverAccessMobile.setDataOServer(dataToSend)**;

这是类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);**
    }
}

现在我的问题是

run()方法中的代码应在单独的线程中运行,而不是在ui线程中如何正确执行?

感谢你

您可以在以下链接中找到有关线程的详细说明: 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)方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM