3

我有以下课程:

主.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 包 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 行得到错误(//<<<< 见下文)。当 json 初始化正确时,代码运行在 mCallback 错误中。当 json 为空时,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");
        }
    }
}
4

2 回答 2

2

使用 LogCat 和您的笔记:

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

它似乎mCallback为空,因为您忘记定义它。让我们稍微改变一下:

  1. 让您的 Activity 实现您的回调:

    public class Main extends Activity implements MyCallbackInterface {
    

    @OverrideonRequestCompleted()必要时添加。

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


    所以删除这段代码:

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


    请改用此构造函数:

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

现在这段代码应该可以正常工作了:

JSONhandler parser = new JSONhandler(this);
parser.execute(url);
于 2013-01-11T19:53:20.167 回答
0

第 107 行的值之一为空。可能是 mCallback,假设您评论“见下文”的行是 107。这是因为从未调用过 JSONParse。请注意,这是一个函数而不是构造函数——它应该是一个构造函数吗?

于 2013-01-11T19:53:19.290 回答