私は次のクラスを持っています:
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");
}
}
}