3

Androidアプリ開発初心者です。Androidサーバーのクライアントチャットを開発してみました

私の最初のプロジェクトのために。これはクライアント側のコードです。クライアントが を押すbtnJoinと、

サーバーに接続し、文字列を送信します。私は多くの例とそれらの多くを読みました

このように見えます。を手に入れましたnetworkOnMainThreadExceptionasyncTaskを防ぐにはどうすればよいですか

この問題?どんな助けでも大歓迎です。

btnJoin = (Button) findViewById(R.id.buttonJoin);
btnJoin.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Socket socket = null;
        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;
        try {
            socket = new Socket("192.168.1.4", 9092);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream.writeUTF("Hello server!");
            txtIP.append(dataInputStream.readUTF() + "\n");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (dataOutputStream != null) {
                try {
                    dataOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (dataInputStream != null) {
                try {
                    dataInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
});
4

4 に答える 4

2

コードを次のように変更します。

   btnJoin.setOnClickListener(new OnClickListener() {
    @Override
   public void onClick(View view){

              new LongOperation().execute("");

    }
}

private class LongOperation extends AsyncTask<String, Void, String> {
     Socket socket = null;
     String strresult="";
        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;
          @Override
          protected String doInBackground(String... params) {

        try {
            socket = new Socket("192.168.1.4", 9092);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream.writeUTF("Hello server!");
            strresult.append(dataInputStream.readUTF() + "\n");
         //   txtIP.append(dataInputStream.readUTF() + "\n");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (dataOutputStream != null) {
                try {
                    dataOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (dataInputStream != null) {
                try {
                    dataInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

                return strresult;
          }      

          @Override
          protected void onPostExecute(String result) {
                TextView txtIP= (TextView) findViewById(R.id.txtIP);
              //  txtIP.append(result + "\n");
                txtIP.setText(result + "\n");

          }

          @Override
          protected void onPreExecute() {
          }

    }  
于 2012-10-12T05:49:52.030 に答える
1

次のようにAsyncTaskを使用します。

まず、クラスにネストします。次のようになります。

private class Communicator extends AsyncTask<Void, Void, Boolean> {
    String tmp;
    String err;

    @Override
    protected Boolean doInBackground() {

        try {
                socket = new Socket("192.168.1.4", 9092);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream.writeUTF("Hello server!");


         } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (dataOutputStream != null) {
                    try {
                        dataOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (dataInputStream != null) {
                    try {
                        dataInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

        return true;
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected void onPostExecute(Boolean result) {
         txtIP.append(dataInputStream.readUTF() + "\n");            


    }
}

AsyncTaskがある場合、次のように開始できます。

...
@Override
public void onClick(View v) {
Communicator c=new Communicator();
c.execute();
}
....
于 2012-10-12T05:51:48.287 に答える
0

このコードをアプリに実装してみてください

private class LongOperation extends AsyncTask<Object, Integer, Object> {

        @Override
        protected void onPreExecute() {



            super.onPreExecute();
        }

        @Override
        protected Object doInBackground(Object... params) {
            //do hard work here
                                return params;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {


        }

        @Override
        protected void onPostExecute(Object result) {



            super.onPostExecute(result);
        }
    } 
于 2012-10-12T05:53:41.407 に答える
0

AsyncTaskを使用するには、サブクラス化する必要があります。サブクラスは少なくとも1つのメソッド(doInBackground(Params ...))をオーバーライドし、ほとんどの場合、2番目のメソッド(onPostExecute(Result))をオーバーライドします。

サブクラス化の例を次に示します。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

作成されると、タスクは非常に簡単に実行されます。

 new DownloadFilesTask().execute(url1, url2, url3);

詳細については、以下のリンクを参照してください...

http://www.vogella.com/articles/AndroidPerformance/article.html

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-10-12T05:53:53.480 に答える