从AsyncTask返回回调响应postExecute:Nullpointerexception

时间:2015-11-11 15:40:43

标签: java android android-asynctask react-native

我已经创建了一个下载图像的组件(在Android端),我想发回有关该应用程序的图像(到JS端)的大小细节。

现在,我可以肯定地说,我可以从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中的一个组件,所以要善待! :)

额外信息 - 我的React模块:

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

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

module.exports = myimage;

然后在我的React app视图中:

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

1 个答案:

答案 0 :(得分: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);

    }
}