如果通过扩展处理程序在seprate java类中创建,则处理程序不起作用

如果通过扩展处理程序在seprate java类中创建,则处理程序不起作用,java,android,Java,Android,我创建了一个类,它扩展了Handler,并重写了handleMessage(Message)方法。 在类中创建的对象扩展了HandlerThead 这是密码 public class WorkHandler extends Handler { private Handler responseHandler; private DownloadListner downloadListner; public WorkHandler(Looper looper) { super(looper

我创建了一个类,它扩展了
Handler
,并重写了
handleMessage(Message)
方法。
在类中创建的对象扩展了
HandlerThead

这是密码

public class WorkHandler extends Handler {

private Handler responseHandler;
private DownloadListner downloadListner;

public WorkHandler(Looper looper) {
    super(looper);
}


@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);
    if (msg.what == 0) {
        @SuppressWarnings("unchecked")
        String url = (String) msg.obj;
        Log.i("tag", "Got a request for url: " + url);
        handleRequest(url);
    }
}

public void setResponseHandler(Handler responseHandler) {
    this.responseHandler = responseHandler;
}


public void setDownloadListner(DownloadListner downloadListner) {
    this.downloadListner = downloadListner;
}  
这里
handleRequest(url)执行图像下载作业

public class DownloderThread extends HandlerThread {

public static final int MESSAGE_DOWNLOAD = 0;
private Map<String, String> mRequestMap = new HashMap<String, String>();
Handler responseHandler;
WorkHandler workHandler;

public DownloderThread(Handler responseHandler) {
    super("DownloaderThread");
    this.responseHandler = responseHandler;
}

DownloadListner mListener;

public void setListener(DownloadListner listener) {
    mListener = listener;
}

@Override
protected void onLooperPrepared() {

    workHandler = new WorkHandler(getLooper());
    workHandler.setResponseHandler(responseHandler);
    workHandler.setDownloadListner(mListener);

}

public void download(String url) {
    mRequestMap.put("URL", url);
    workHandler.obtainMessage(MESSAGE_DOWNLOAD, url).sendToTarget();
}
}  
我确信这不是由于处理程序.obtainMessage()
造成的

活动包含以下代码

public class ImageDownloadActivity extends AppCompatActivity implements DownloadListner {
ImageView imageView;
Button button;
Handler responseHandler;
DownloderThread thread;
String url = "http://developer.android.com/design/media/principles_real_objects.png";

boolean isThreadRunning = false;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_image_download);
    responseHandler = new Handler();
    thread = new DownloderThread(responseHandler);
    thread.setListener(this);
    imageView = (ImageView) findViewById(R.id.imageView);
    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isThreadRunning){
                Log.i("tag","Already running");
            }else {
                Log.i("tag", "Background thread started");
                thread.start();
                thread.getLooper();
                thread.download(url);
                isThreadRunning = true;
            }
        }
    });
}


@Override
public void onImageDownloadComplete(Bitmap bitmap) {
    imageView.setImageBitmap(bitmap);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    thread.quit();
    Log.i("tag", "Background thread destroyed");
    }
}  
我还更改了
WorkHandler
类的构造函数,但结果是一样的。
以下是堆栈跟踪:

FATAL EXCEPTION: main
Process: com.sophomoreventure.myapplication9, PID: 12914
  java.lang.NullPointerException
  at com.sophomoreventure.myapplication9.DownloderThread.download(DownloderThread.java:41)
  at com.sophomoreventure.myapplication9.ImageDownloadActivity$1.onClick(ImageDownloadActivity.java:43)
  at android.view.View.performClick(View.java:4463)
  at android.view.View$PerformClick.run(View.java:18770)
  at android.os.Handler.handleCallback(Handler.java:808)
  at android.os.Handler.dispatchMessage(Handler.java:103)
  at android.os.Looper.loop(Looper.java:193)
  at android.app.ActivityThread.main(ActivityThread.java:5292)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
  at dalvik.system.NativeStart.main(Native Method)

下载侦听器初始化?是否可以检查是否在DownloaderThread类中对setListener()进行了调用?由于低声誉,张贴它作为一个答案

由于不涉及自动取消装箱(这可能引发
NullPointerException
),因此
workHandler
workHandler.ActainMessage(…)
的结果都是空的。您可以确定这不是由于
Handler.obtainMessage(…)
造成的,因为
workHandler
为空。
workHandler
onLooperPrepared(…)
中设置,因此请验证并确保调用它


旁注:永远不要基于假设排除某些东西,始终通过测试和/或调试进行验证。否则您可以很容易地在错误的位置查看和搜索…

您可以粘贴完整的错误堆栈跟踪吗?解决了问题。刚刚在
onCreate()
方法中移动了
thread.start()
thread.getLooper()
FATAL EXCEPTION: main
Process: com.sophomoreventure.myapplication9, PID: 12914
  java.lang.NullPointerException
  at com.sophomoreventure.myapplication9.DownloderThread.download(DownloderThread.java:41)
  at com.sophomoreventure.myapplication9.ImageDownloadActivity$1.onClick(ImageDownloadActivity.java:43)
  at android.view.View.performClick(View.java:4463)
  at android.view.View$PerformClick.run(View.java:18770)
  at android.os.Handler.handleCallback(Handler.java:808)
  at android.os.Handler.dispatchMessage(Handler.java:103)
  at android.os.Looper.loop(Looper.java:193)
  at android.app.ActivityThread.main(ActivityThread.java:5292)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
  at dalvik.system.NativeStart.main(Native Method)