2015-11-11 103 views
1

我已經創建了一個下載圖片的組件(在Android端),我想發回有關該應用的圖片(到JS端)的大小細節。從AsyncTask postExecute返回回調響應:Nullpointerexception

現在,我可以放心地說,我可以從JS調用我的組件,它會回覆數據,但只要我添加了Async元素從URL下載圖像,閱讀並響應我得到NullpointerException只要我打電話給我的callback.invoke("response text");

我有問題的代碼是:

public void loadImage(final String url, final Callback onLoadCallback)  { 
    ... 
    new AsyncTask<String, Void, Void>() { 
     @Override 
     protected Void doInBackground(String... url) { 
      try { 
       theImage = Glide.with(getReactApplicationContext()).load(url[0]).asBitmap().into(-1, -1).get(); 
      } 
      catch ... 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void dummy) { 
      if (null != theImage) { 

        onLoadCallback.invoke("Success"); //<== THIS LINE HERE 
      } 
     } 
    }.execute(url); 
    ... 


} 

現在,我明白那是因爲我想在SEP線程通過回調回返回到主線程,但我不確定我該如何獲得我想回到JS方面的信息?!這是我第一次嘗試在RN的組件,所以要善良! :)

額外的信息 - 我的陣營模塊:

var MY_Image = require('NativeModules').MYImage; 

var myimage = { 
    loadImage(url, onLoad) { 
     MY_Image.loadImage(url, onLoad) 
    }, 
}; 

module.exports = myimage; 

然後在我的陣營應用視圖:

... 
componentDidMount: function() { 
    myImage.loadImage('[URL to Image]',onLoad=> { 
     console.log('Success: '+onLoad); 
    }); 
} 
+0

你的回調函數可能首先是空的。你甚至在調用AsyncTask之前是否嘗試過測試它是否爲空? – NoChinDeluxe

+0

我已經做了更多的工作,我*可能會*覆蓋@drschultz - 只是檢查我的解決方案,我希望能夠很快發佈更多信息! – scgough

+0

在@johanneslumpe的'react-native-fs'組件中找到了一些東西,它幫助我找出了一些東西 – scgough

回答

2

感謝大家的輸入。我設法對此進行分類。我需要一個類的變量來保存回調和回調處理程序。這裏是我的代碼:

public class MyClass extends ReactContextBaseJavaModule { 

    private Bitmap mTheImage; 
    private Callback mCallback; 
    private WritableMap mResults; 

    public MyClass(ReactApplicationContext reactContext) { 
     super(reactContext); 
     this.mContext = reactContext; 
    } 

    private void consumeCallback(String type, WritableMap obj) { 
     if(mCallback!=null) { 
      obj.putString("type", type); 

      mCallback.invoke(obj); 
      mCallback = null; 
     } 
    } 

    @ReactMethod 
    public void doMyStuff(final String input, final Callback callback) { 
     if(mCallback==null) { 
      mResults = Arguments.createMap(); 
     } 

     mCallback = callback; 

     new AsyncTask<String, Void, Void>() { 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
      } 

      @Override 
      protected Void doInBackground(String... params) { 

       try { 
        String myValue = params[0]; 

        mResults.putString("myValue", myValue); 

       mTheImage = [method to get the image] 

       } 
       catch(Exception e) { 

       } 

       return null; 
      } 

      protected void onPostExecute(Void dummy) { 

       if(null!=mTheImage && null!=mCallback) { 

        mResults.putInt("width", mImage.getWidth()); 
        mResults.putInt("height",mImage.getHeight()); 

        consumeCallback("success", mResults); 
       } 
       else { 
        consumeCallback("error", mResults); 
       } 
      } 
     }.execute(url); 

    } 
} 
+0

這是一個艱難的,但我學到了很多關於反應原生做它! – scgough