2

作業する次のコードがありますが、これがどのように機能するのか理解できませんでした。最初に次のリンクを参照してください

http://developer.android.com/reference/android/os/Message.html#sendToTarget%28%29

sendToTarget() が getTarget() によって指定された Handler にメッセージを送信するか、NPE をスローすることを明確に示しています。次のコードでは、getTarget() の実装が表示されませんが、正常に動作しています。これがどのように機能するかを説明してください。ここで queueThumbnail() 関数を探してください。どのように機能するか理解していないコメントで正確に指定されています

public class ThumbnailDownloader<Token> extends HandlerThread {

    private static final String TAG = "ThumbNailDownloader";
    private static final int MESSAGE_DOWNLOAD = 0;

    Handler mHandler;
    Map <Token, String> requestMap = Collections.synchronizedMap(new HashMap<Token,String>());

public ThumbnailDownloader(Handler responseHandler)
    {
        super(TAG);
    }

@SuppressLint("HandlerLeak")
    @Override
    protected void onLooperPrepared()
    {
        mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg)
            {
                if(msg.what==MESSAGE_DOWNLOAD)
                {
                    @SuppressWarnings("unchecked")
                    Token token = (Token)msg.obj;
                    Log.i(TAG, "Got a request for Url:"+requestMap.get(token));
                    handleRequest(token);
                }
            }
        };

    }

public void handleRequest(final Token token)
    {
        try
        {
            final String url = requestMap.get(token);
            if(url == null) return;

            byte[] bitmapBytes = new FlickrFetchr().getUrlBytes(url);
            final Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
            Log.i(TAG, "Bitmap Created");
            mResponseHandler.post(new Runnable(){
                public void run()
                {
                    if(requestMap.get(token)!=url) return;

                    requestMap.remove(token);
                    mListener.onThumbnailDownloaded(token, bitmap);
                }
            });
        }
        catch(IOException ioe)
        {
            Log.e(TAG, "Error Downloading Image"+ioe);
        }
    }

public void queueThumbnail(Token token, String url)
    {
        Log.i(TAG, "Got an URL: "+url);
        requestMap.put(token, url);

        mHandler.obtainMessage(MESSAGE_DOWNLOAD, token).sendToTarget();
            //some other class calls this function
            //here the target is not set, but I see the request is handled well
            //how is this possible? getTarget() is not set anywhere is here
    }
4

1 に答える 1

3

ここを見てください https://android.googlesource.com/platform/frameworks/base.git/+/6083d81ce4d67ec632962270fda64ebb9db0d5b1/core/java/android/os/Message.java、ところで、HandlerThreadを拡張している場合はすべてがわかりますあなたはおそらく間違った道を進んでいる

于 2013-09-30T06:48:58.923 に答える