2016-01-03 30 views
0

我創建了一個擴展了Handler並覆蓋了handleMessage(Message)方法的類。在類
創建的對象,在這裏延伸HandlerThead
是代碼如果通過擴展Handler創建分離java類中的處理程序不工作

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(); 
} 
} 

這裏以下行給出的NullPointerException。爲什麼?

workHandler.obtainMessage(MESSAGE_DOWNLOAD, url).sendToTarget(); 

我相信這不是由於Handler.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) 
+0

您可以粘貼完整的錯誤堆棧跟蹤嗎?已添加 – harshavmb

+0

堆棧跟蹤。 –

回答

0

DownloadListener初始化?你可以檢查在DownloaderThread類中調用setListener()嗎?由於低聲譽,發佈它作爲答案!

0

好吧,由於不涉及自動取消裝箱(可能會引發NullPointerException),因此可能是workHandlerworkHandler.obtainMessage(…)的結果爲空。你可以確定它不是由於Handler.obtainMessage(…)而必須是因爲workHandler爲空。 workHandler設置爲onLooperPrepared(…),因此請驗證並確保它被調用。

附註:不要根據假設排除某些東西,總是通過測試和/或調試來驗證。否則,您可以輕鬆地在錯誤的位置查找和搜索...

+0

解決了這個問題。在'onCreate()'方法中移動了'thread.start()'和'thread.getLooper()'。 –

相關問題