运行服务器不在Ui线程中

时间:2014-04-11 15:48:29

标签: android android-asynctask

我想运行我的ServerSocket并且我知道如何使用Thread进行操作,但我想在Ui中启动它,所以我在考虑使用AsyncTask启动此服务器。

我有代码:

ServerSocket serversocket = new ServerSocket();            
serversocket.execute();


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

        public void DataFetcher(android.support.v4.app.FragmentManager fragmentManager){
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... params) {
            String data = null;
            Toast.makeText(getApplicationContext(), "server is on", Toast.LENGTH_SHORT).show();
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            // make gui thread do some work
        }

    }

但它没有用,有人能告诉我该怎么办?

我使用AsyncTask运行ServerClient,我也想运行我的服务器谎言, 这是我的客户代码:

public class MyClientTask extends AsyncTask<Void, Void, Void> {   
      String dstAddress="..."
      int dstPort=8080;
      String response = "";

      MyClientTask(String addr, int port){
       dstAddress = addr;
       dstPort = port;
      }

    @Override
    protected Void doInBackground(Void... arg0) {
           Socket socket = null;           
           try {
            socket = new Socket(dstAddress, dstPort);                                   
           } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
           }finally{
            if(socket != null){
             try {
              socket.close();
             } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }
            }
           }
           return null;
          }
          @Override
          protected void onPostExecute(Void result) 
          {
           super.onPostExecute(result);
          }
    }

}

1 个答案:

答案 0 :(得分:0)

这是错误的

Toast.makeText(getApplicationContext(), "server is on", Toast.LENGTH_SHORT).show();

Toast在主线程上运行,因为您无法更新后台Thread中的UI元素,因此无法从doInBackgroud()

调用它

您可以通过onPostExecute()

中的onProgressUpdate()publishProgress()doInBackground()进行此操作

如果它仍然不起作用,那么定义“但它不起作用”。这不是一个非常有用的摘要,说明发生了什么/不发生。

  

我知道如何使用Thread进行操作,但我想在Ui中启动它

如果您在单独的Thread中运行它,那么在<{1}}上运行