【问题标题】:Return Callback response from AsyncTask postExecute: Nullpointerexception从 AsyncTask postExecute 返回回调响应:Nullpointerexception
【发布时间】:2015-11-11 15:40:43
【问题描述】:

我创建了一个组件,用于下载图像(在 Android 端),我想将关于我的应用程序的该图像(到 JS 端)的大小详细信息发送回。

现在,我可以有把握地说,我可以从 JS 调用我的组件,它会返回数据,但只要我添加 Async 元素以从 URL 下载图像,阅读它并响应我得到只要我打电话给我的callback.invoke("response text");NullpointerException

我有问题的代码是:

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 应用视图中:

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

【问题讨论】:

  • 您的回调可能一开始就为空。您是否尝试过在调用 AsyncTask 之前测试它是否为空?
  • 我做了更多的工作,我可能已经涵盖了@drschultz - 只是检查我的解决方案,我希望能够尽快发布更多信息!
  • 在 @johanneslumpe 的 react-native-fs 组件中找到了一些东西,帮助我弄清楚了一些事情
  • @drschultz 我认为你是对的。我的回调为空(在异步结束时),因此它引发了异常。我怎么能解决这个问题?!我不怕说我现在有点困惑!
  • 您必须发布更多代码,以便我们了解您是如何定义/实例化/实现回调的。既然那是空的,我们将不得不深入研究那个特定的代码。

标签: java android android-asynctask react-native


【解决方案1】:

感谢大家的投入。我已经设法对此进行了排序。我需要一个类范围的变量来保存回调和一个回调处理程序。这是我的代码:

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

    }
}

【讨论】:

  • 这是一个艰难的过程,但我学到了很多关于 react-native 的知识!
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 2017-12-08
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多