I have the following classes:
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.....
I’m very new to Java/Android and can’t figure out whats happening here.
Hope some one can help me.
UPDATED CODE:
I updated the code, but still get the error on Line 107 (//<<<< see below).
When json is initialized correct, the code runs in the mCallback error.
When json is null, the TryCatch catches the error and logs “empty”.
The new code for Main and change the code on suggestion of 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();
}
}
}
The new code for JSONhandler and change the code on suggestion of 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");
}
}
}
With the LogCat and your note:
It appears
mCallbackis null, since you forgot to define it. Let’s change things around a little:Have your Activity implement your callback:
And add
@OverridetoonRequestCompleted()if necessary.Remove the
JSONhandlerconstructor that expects an Activity and replace it with one that expects your interface.So remove this code:
Use this constructor instead:
Now this code should work just fine: