Android Java接口回调onPostExecute nullpointer异常

时间:2013-01-11 19:49:38

标签: java android callback

我有以下课程:

Main.java

package com.example.webapp;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class Main extends Activity {


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.settings:
                showSettings();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    final Handler handler = new Handler()
    {
        public void handleMessage(Message msg) 
        {

            try {
                final String result = msg.toString();
                JSONObject jObject  = new JSONObject(result.toString());
                mainView(jObject);
              }
              catch(JSONException e) {
                e.getCause();
              }


        };
    };

    public void mainView(JSONObject result){

    }

    public void showSettings(){
        setContentView(R.layout.settings);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Oncreate","1");
        String url = "http://xxx.xxx.xxx/webapp/server.php?method=getPageIndexLiveValues";
        Log.d("Oncreate","2");
        JSONhandler parser = new JSONhandler(this);
        parser.execute(url);

        Log.d("Oncreate","3");



    }


        public void onRequestCompleted(JSONObject result) {
            setContentView(R.layout.main);
           Log.d("onRequestComplete","complete");
            try {
                TextView test1 = (TextView) findViewById(R.id.textView1);
                test1.setText(result.getString("GP").toString()+"W");
                TextView test2 = (TextView) findViewById(R.id.textView2);
                test2.setText(result.getString("IP").toString()+"W");
                TextView test3 = (TextView) findViewById(R.id.textView3);
                test3.setText(result.getString("EFF").toString()+"%");

                Time today = new Time(Time.getCurrentTimezone());
                today.setToNow();


                TextView textViewDay = (TextView) findViewById(R.id.textDateTime);

                textViewDay.setText(today.monthDay+"-"+(today.month+1)+"-"+today.year+" "+today.format("%k:%M:%S"));             // Day of the month (0-31)

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }



}

JSONhandler.java     package com.example.webapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.util.Log;

public class JSONhandler extends AsyncTask<String, Void, JSONObject> {

    //private static final JSONObject JSONObject = null;
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    public JSONhandler(Main main){

    }

    public interface MyCallbackInterface {
        public void onRequestCompleted(JSONObject json);
    }

    private MyCallbackInterface mCallback;

    public void JSONParser(MyCallbackInterface callback) {
        mCallback = callback;
    }

    public JSONObject getJSONFromUrl(String url) { 
        Log.d("getJSONFromUrl","1");        
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;


    }

    @Override
    protected JSONObject doInBackground(String... params) {
        Log.d("doInBackground","1");
        String url = params[0];
        Log.d("doInBackground",url);
        Log.d("doInBackground","2");
        return getJSONFromUrl(url);
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        Log.d("onPostExecute",result.toString());

        //In here, call back to Activity or other listener that things are done
        try{
            JSONObject json = result.getJSONObject("sumIn");
            Log.d("onPostE Sum",json.toString());
            mCallback.onRequestCompleted(json); //<<<<<< See bel
        }catch(JSONException e){
            Log.d("onPostE Sum",json.toString());
        }
    }
}

!!!!ERROR MESSAGE!!!!
E/AndroidRuntime(2237): FATAL EXCEPTION: main
E/AndroidRuntime(2237): java.lang.NullPointerException
E/AndroidRuntime(2237):     at com.example.webapp.JSONhandler.onPostExecute(JSONhandler.java:107)
E/AndroidRuntime(2237):     at com.example.webapp.JSONhandler.onPostExecute(JSONhandler.java:1)
and a lot more.....

我是Java / Android的新手,无法弄清楚这里发生了什么。 希望有人可以帮助我。

更新代码: 我更新了代码,但仍然在第107行得到错误(//&lt;&lt;&lt;&lt;&lt;见下文)。 当json初始化正确时,代码在mCallback错误中运行。 当json为null时,TryCatch捕获错误并记录“空”。

Main的新代码,并根据Sam的建议更改代码。

package com.example.webapp;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

import com.example.webapp.JSONhandler.MyCallbackInterface;

    public class Main extends Activity implements MyCallbackInterface  {


        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle item selection
        switch (item.getItemId()) {
            case R.id.settings:
                showSettings();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    final Handler handler = new Handler()
    {
        public void handleMessage(Message msg) 
        {

            try {
                final String result = msg.toString();
                JSONObject jObject  = new JSONObject(result.toString());
                mainView(jObject);
              }
              catch(JSONException e) {
                e.getCause();
              }


        };
    };

    public void mainView(JSONObject result){

    }

    public void showSettings(){
        setContentView(R.layout.settings);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Oncreate","1");
        String url = "http://xxx.xxx.xxx";
        Log.d("Oncreate","2");
        JSONhandler parser = new JSONhandler(this);
        parser.execute(url);

        Log.d("Oncreate","3");



    }

    @Override
    public void onRequestCompleted(JSONObject result) {
        setContentView(R.layout.main);
        Log.d("onRequestComplete","complete");
            try {
                TextView test1 = (TextView) findViewById(R.id.textView1);
                test1.setText(result.getString("GP").toString()+"W");
                TextView test2 = (TextView) findViewById(R.id.textView2);
                test2.setText(result.getString("IP").toString()+"W");
                TextView test3 = (TextView) findViewById(R.id.textView3);
                test3.setText(result.getString("EFF").toString()+"%");

                Time today = new Time(Time.getCurrentTimezone());
                today.setToNow();


                TextView textViewDay = (TextView) findViewById(R.id.textDateTime);

                textViewDay.setText(today.monthDay+"-"+(today.month+1)+"-"+today.year+" "+today.format("%k:%M:%S"));             // Day of the month (0-31)

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }



}

JSONhandler的新代码,并根据Sam的建议更改代码。

package com.example.webapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.util.Log;

public class JSONhandler extends AsyncTask<String, Void, JSONObject> {

    //private static final JSONObject JSONObject = null;
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    public JSONhandler(Main main){

    }

    public interface MyCallbackInterface {
        public void onRequestCompleted(JSONObject json);
    }

    private MyCallbackInterface mCallback;

    public JSONhandler(MyCallbackInterface callback) {
        mCallback = callback;
    }

    public JSONObject getJSONFromUrl(String url) { 
        Log.d("getJSONFromUrl","1");        
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;


    }

    @Override
    protected JSONObject doInBackground(String... params) {
        Log.d("doInBackground","1");
        String url = params[0];
        Log.d("doInBackground",url);
        Log.d("doInBackground","2");
        return getJSONFromUrl(url);
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        Log.d("onPostExecute",result.toString());

        //In here, call back to Activity or other listener that things are done
        try{
            JSONObject json = result.getJSONObject("sumInvrters");
            Log.d("onPostE Sum",json.toString());
            mCallback.onRequestCompleted(json); //<<<< see below 
        }catch(JSONException e){
            Log.d("onPostE Sum","empty");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

使用LogCat和你的笔记:

mCallback.onRequestCompleted(json); //<<<<<< See bel

看起来mCallback为空,因为您忘了定义它。让我们改变一下:

  1. 让您的活动实施回调:

    public class Main extends Activity implements MyCallbackInterface {
    

    如有必要,请将@Override添加到onRequestCompleted()

  2. 删除需要Activity的JSONhandler构造函数,并将其替换为需要您的接口的构造函数。


    删除此代码:

    public JSONhandler(Main main){
    
    }
    
    public void JSONParser(MyCallbackInterface callback) {
        mCallback = callback;
    }
    

    <击>


    请改用此构造函数:

    public JSONhandler(MyCallbackInterface callback) {
        mCallback = callback;
    }
    
  3. 现在这段代码应该可以正常工作:

    JSONhandler parser = new JSONhandler(this);
    parser.execute(url);
    

答案 1 :(得分:0)

第107行的其中一个值为null。可能是mCallback,假设您评论的行“见下文”是107.这是因为JSONParse从未被调用过。请注意,这是一个函数而不是构造函数 - 它是否意味着构造函数?