Android AsyncTask-to-Activity 回调 nullPointerException

Posted

技术标签:

【中文标题】Android AsyncTask-to-Activity 回调 nullPointerException【英文标题】:Android AsyncTask-to-Activity callback nullPointerException 【发布时间】:2013-10-22 11:00:52 【问题描述】:

我正在尝试将一些 JSONObject 数据从我的 AsyncTask.OnPostExecute 传递回我的 MainActivity.JSONCallBackComplete。

我的问题是,当我尝试检查传回的 JSONObject 时,我得到以下执行:

10-14 18:40:25.820: E/androidRuntime(4153): FATAL EXCEPTION: main
10-14 18:40:25.820: E/AndroidRuntime(4153): java.lang.NullPointerException
10-14 18:40:25.820: E/AndroidRuntime(4153):     at com.icerge.revivaltimes.MainActivity.JSONCallBackComplete(MainActivity.java:31)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at com.icerge.revivaltimes.JsonObj.onPostExecute(JsonObj.java:70)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at com.icerge.revivaltimes.JsonObj.onPostExecute(JsonObj.java:1)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.os.AsyncTask.finish(AsyncTask.java:417)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.os.Looper.loop(Looper.java:144)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at android.app.ActivityThread.main(ActivityThread.java:4937)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at java.lang.reflect.Method.invokeNative(Native Method)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at java.lang.reflect.Method.invoke(Method.java:521)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-14 18:40:25.820: E/AndroidRuntime(4153):     at dalvik.system.NativeStart.main(Native Method)

我的 MainActivity 类如下:

public class MainActivity extends Activity

        private JSONObject jsonData = null;

        public void JSONCallBackComplete(JSONObject jsonData)
            this.jsonData = jsonData;
            Log.e("TESTing in callback: ", jsonData.toString()  );
        

        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            new JsonObj(this).execute("http://myserver/json");
         
    

而我的 AsyncTask 类如下:

public class JsonObj extends AsyncTask<String, Void, JSONObject>
    MainActivity activity;
    int tid;
    String term;

    public JsonObj(MainActivity activity)
        this.activity = activity;
//      Log.e("TESTING: ", activity.getClass().toString());
    

    @Override
    protected JSONObject doInBackground(String... url) 
        // TODO Auto-generated method stub
        DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httppost = new HttpPost(url[0]);
        JSONObject jsonObject = null;
        // Depends on your web service
        httppost.setHeader("Content-type", "application/json");

        InputStream inputStream = null;
        String result = null;
        try 
            HttpResponse response = httpclient.execute(httppost);           
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // json is UTF-8 by default
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line + "\n");
            
            result = sb.toString();
            Log.e("JSON-Test [RESULT]: ", result);
            jsonObject = new JSONObject(result);
         catch (Exception e)  
            Log.e("JSON-Test [exception]: ", e.toString());
        
        finally 
            tryif(inputStream != null)inputStream.close();catch(Exception squish)
        

        return jsonObject;
    

    @Override
protected void onPostExecute(JSONObject result) 
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    if( !result.equals(null) )
        this.activity.JSONCallBackComplete(result);
    


我在 AsyncTask 中有一个构造函数,它分配 MainActivity-Context 并使用它通过 JSONObject 参数调用我的 JSONCallBackComplete 反馈函数。

但是,我没有显示我的 JSON-DATA,而是得到了上面粘贴的异常。

【问题讨论】:

在我看来MainActivity 的第 31 行是空的,你确定你的 jsonData 对象返回那里时不为空吗? result nullonPostExecute() 中吗? 我已在两个相关位置执行了“.equals(NULL)”检查,但空指针异常仍然存在。我的代码已更新以显示 onPostExecute 函数中的检查 在你之前return jsonObject; 尝试打印它。 @SargeBorsch AsyncTask 未被弃用:)。它在已弃用的 onRetainConfigurationInstance 上。而sisko并没有使用函数来保留之前的状态。 【参考方案1】:

你有NullPointerExceptions。我看到的第一个来自这里

if(!result.equals(null) )

这实际上应该是

if (result != null) 

您不应该真正使用.equals()null 进行比较,因为.equals() 通常用于检查人类感知的两个对象的值是否相同,而不是内存地址。当您想将某个内容与null 内存地址进行比较时,只需使用直接的==!=,Java 将为您比较地址(您想要什么)。

【讨论】:

谢谢。我相应地更正了我的结果检查,但我的 if 语句没有触发。这可能意味着我的 doInBackground 函数没有发送任何数据,或者其他我没有看到的东西 您的网络请求可能失败。完成附加后,看看你的 StringBuilder sb 是什么。 doInBackground 函数中的字符串生成器拥有从服务器获取的所有数据。它正确打印 JSON 数据

以上是关于Android AsyncTask-to-Activity 回调 nullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录