3

私は次のクラスを持っています:

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パッケージ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が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");
        }
    }
}
4

2 に答える 2

2

LogCat とメモ:

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

mCallback定義するのを忘れたため、null のようです。物事を少し変えてみましょう:

  1. Activity にコールバックを実装させます。

    public class Main extends Activity implements MyCallbackInterface {
    

    また、必要に応じて追加@OverrideonRequestCompleted()ます。

  2. アクティビティを期待するコンストラクターを削除しJSONhandler、インターフェイスを期待するコンストラクターに置き換えます。


    したがって、このコードを削除します。

    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 行目の値の 1 つが null でした。「以下を参照」とコメントした行が 107 であると仮定すると、おそらく mCallback です。これは、JSONParse が呼び出されなかったためです。これはコンストラクターではなく関数であることに注意してください。コンストラクターを意図していたのでしょうか?

于 2013-01-11T19:53:19.290 に答える