5

私はこのアプリケーションを作成しており、tcp接続からライブ画像を取得し、それらをImageVievに表示する必要があります。

私がしているのは、ボタンクリック内で非同期タスクを呼び出すことです。しかし、それは多くのバックグラウンドスレッドを作成しているようです。

これはボタンクリックイベントのコードです

    btnLive.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        try
        {
            String name = ((Button)v).getText().toString();
            if(name.equalsIgnoreCase("Live"))
            {
                DataOutputStream dos;
                DataInputStream dis;
                String reply;

                if(config.conn.isConnected())
                {
                    dos = new DataOutputStream(config.conn.getOutputStream());
                    dos.writeBytes("STREAM-LIVE-IMAGES");                                       
                    dos.flush();
                    //dis = new DataInputStream(in);

                    in = config.conn.getInputStream();                      
                    while (true) 
                    {                               
                        new myTask().execute(in);
                    }
                }                   
            }
        }
        catch(Exception ex)
        {
            Log.d("Live Button ", "Exception " + ex.getMessage() );
        }
    }
});

そしてこれはasyncTaskのコードです

 class myTask extends AsyncTask<InputStream, Integer, Bitmap> {

protected Bitmap doInBackground(InputStream...in) 
{
    Bitmap bmp = null;

    try 
    {
        //Do some none UI stuff here and return a value *result                 
        byte[] rcvPacket = ReadJpegBinaryAndRemoveDelimiter(in[0]);
        bmp = BitmapFactory.decodeByteArray(rcvPacket, 0, rcvPacket.length);
        Log.d("Live Image Streaming ", "Recieved Images: " + rcvPacket.length + " " +  bmp);

    } catch (Exception e) {
        e.printStackTrace();                    
    }
    return bmp;
}
4

2 に答える 2

4
while (true) {                               
 new myTask().execute(in);
}

あなたはループで実行AsyncTaskしているので、あなたの場合は無限ループで、それはあまりよく聞こえません、あなたはそれを変える必要があります。

ループの外側で実行する必要があります。あなたはそれをするべきではありません。

電話するだけ

new myTask().execute(in);

ループなし。

于 2012-07-09T12:46:18.950 に答える
0

asynctaskが私の問題の適切なオプションではなかったため、バックグラウンドスレッドでそれを整理することができました。

そこで、別のバックグラウンドスレッドを作成し、imageviewでpostrunnableメソッドを使用してUIを更新しました。

于 2012-07-09T17:59:55.143 に答える