2

asynctask でクライアント ソケット接続を実行する次のコードがあります。

@Override
protected Boolean doInBackground(Void... params) { //This runs on a different thread
    boolean result = false;
    try {
        Log.i("AsyncTask", "doInBackground: Creating socket");
        SocketAddress sockaddr = new InetSocketAddress("192.168.1.115", 9090);
        nsocket = new Socket();
        nsocket.connect(sockaddr, 5000); //10 second connection timeout
        if (nsocket.isConnected()) { 
            nis = nsocket.getInputStream();
            wr = new BufferedWriter(new OutputStreamWriter(nsocket.getOutputStream()));
            Log.i("AsyncTask", "doInBackground: Socket created, streams assigned");
            Log.i("AsyncTask", "doInBackground: Waiting for inital data...");
            sockState = true;
            byte[] buffer = new byte[4096];
            int read = nis.read(buffer, 0, 4096); //This is blocking
            while(read != -1){
                byte[] tempdata = new byte[read];
                System.arraycopy(buffer, 0, tempdata, 0, read);
                publishProgress(tempdata);
                Log.i("AsyncTask", "doInBackground: Got some data");
                read = nis.read(buffer, 0, 4096); //This is blocking
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("AsyncTask", "doInBackground: IOException");
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("AsyncTask", "doInBackground: Exception");
        result = true;
    } finally {
        try {
            nis.close();
            wr.close();
            nsocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("AsyncTask", "doInBackground: Finished");
    }
    return result;
}

@Override
protected void onProgressUpdate(byte[]... values) {
     Log.d("KMC.NetworkTask", String.valueOf(values[0]));
    if (values.length > 0) {
        Log.d("KMC.NetworkTask", "onProgressUpdate: " + values[0].length + " bytes received.");
        result = new String(values[0]);
    }
}

ソケットは機能します。ただし、バックグラウンド タスクがデータが入ったことを通知しても、onProgressUpdate は呼び出されません。

誰かが私にいくつかの指針を持っていますか?? Google で何も見つかりませんでした :|

4

3 に答える 3

0

今のところ、私は次のように解決しました:

@Override
protected Boolean doInBackground(Void... params) { //This runs on a different thread
    try {
        Log.i("AsyncTask", "doInBackground: Creating socket");
        SocketAddress sockaddr = new InetSocketAddress("192.168.1.115", 9090);
        nsocket = new Socket();
        nsocket.connect(sockaddr, 5000); //10 second connection timeout
        if (nsocket.isConnected()) { 

            in = new BufferedReader(new InputStreamReader(nsocket.getInputStream()));
            wr = new BufferedWriter(new OutputStreamWriter(nsocket.getOutputStream()));
            Log.i("AsyncTask", "doInBackground: Socket created, streams assigned");
            sockState = true;

            String inputLine = "";
            while ((inputLine = in.readLine()) != null) {
                result = inputLine;
                Log.d("AsyncTask", "doInBackground: Got some data:" + inputLine);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("AsyncTask", "doInBackground: IOException");
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("AsyncTask", "doInBackground: Exception");
    } finally {
        try {
            nis.close();
            wr.close();
            nsocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("AsyncTask", "doInBackground: Finished");
    }
    return true;
}

public String getResult(){
    String r = result;
    result = null;
    return r;
}

メイン スレッドは結果を待ってから、getResult() で結果を取得します。

while(null == networktask.result){}
Log.d("KMC.onCreate", networktask.getResult());
于 2012-04-23T20:35:58.183 に答える
0

AsyncTask サブクラスのコンストラクターを実装し、その中で super() を呼び出さなかったため、同様の問題が発生しました。

public class TNailTask extends AsyncTask<File, Integer, HashMap<Integer, BitmapDrawable>> {

private DirListingAdapter dir_listing;
private Context context;

public TNailTask(DirListingAdapter dir_listing, Context context) {
    super(); // call super to make sure onProgressUpdate works
    this.dir_listing = dir_listing;
    this.context = context;
}

protected HashMap<Integer, BitmapDrawable> doInBackground(File... image_files) {
  ....
}

protected void onProgressUpdate(Integer... progress) {
  ....
}

}

于 2015-08-30T02:09:04.723 に答える
0

Values はテーブルなので、values[0] を書き込むとバイトのテーブルが得られるので、そのようなものを作成する必要があると思います: String.valueOf(values[0][0])

于 2012-04-19T15:45:48.627 に答える