I am making an android app in which i want to load json data. My specification is that, if there is internet available, then load the data from a url which i provide.
If There is no internet, then load the local json.txt file.
My app is able to load the data from the url if there is internet connection and it can load the local json data if there is absolute no internet connection.
However in meta state such as this, my app crashes.
The log is
07-14 09:56:21.258 22499-28349/scientist.jobless.foodmana E/log_tag﹕ Error in http connection java.net.UnknownHostException: Unable to resolve host "lit-hamlet-6856.herokuapp.com": No address associated with hostname
07-14 09:56:21.258 22499-28349/scientist.jobless.foodmana E/log_tag﹕ Error converting result java.lang.NullPointerException
07-14 09:56:21.258 22499-28349/scientist.jobless.foodmana E/log_tag﹕ Error parsing data org.json.JSONException: End of input at character 0 of
07-14 09:56:21.266 22499-28349/scientist.jobless.foodmana E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at scientist.jobless.foodmana.JsonLoadSubFirstFirst$DownloadJSON.doInBackground(JsonLoadSubFirstFirst.java:239)
at scientist.jobless.foodmana.JsonLoadSubFirstFirst$DownloadJSON.doInBackground(JsonLoadSubFirstFirst.java:215)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
07-14 09:56:21.878 22499-22499/scientist.jobless.foodmana E/WindowManager﹕ Activity scientist.jobless.foodmana.JsonLoadSubFirstFirst has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@5374c12c that was originally added here
android.view.WindowLeaked: Activity scientist.jobless.foodmana.JsonLoadSubFirstFirst has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@5374c12c that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:547)
at android.app.Dialog.show(Dialog.java:277)
at scientist.jobless.foodmana.MyCustomProgressDialog.show(MyCustomProgressDialog.java:43)
at scientist.jobless.foodmana.JsonLoadSubFirstFirst$DownloadJSON.onPreExecute(JsonLoadSubFirstFirst.java:227)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at scientist.jobless.foodmana.JsonLoadSubFirstFirst.onCreate(JsonLoadSubFirstFirst.java:74)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Below is my java code where i am checking for connection type.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the view from listview_main.xml
setContentView(R.layout.listview_main);
// Execute DownloadJSON AsyncTask
ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if (connec != null && (
(connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) ||
(connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED))) {
new DownloadJSON(this).execute();
//You are connected, do something online.
} else if (connec != null && (
(connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED) ||
(connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED ))) {
//Not connected.
Toast.makeText(getApplicationContext(), "You must be connected to the internet", Toast.LENGTH_LONG).show();
new LocalDownloadJSON().execute();
}
else if (connec != null && (
(connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.UNKNOWN) ||
(connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.UNKNOWN ))) {
//i want to load local json data here
}
}
My question is that how to handle that meta state of connection as i have shown in the emulator's picture.
i have tried this answer but i get error on isNetworkAvailable(context)
as cannot resolve method isNetworkAvailable.
Is there anyway by this code ??
(connec != null && (
(connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.UNKNOWN) ||
(connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.UNKNOWN )))
LocalJsonDownload.java
private class LocalDownloadJSON extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(JsonLoadSubFirstFirst.this);
pd.setMessage("Loading...");
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.show();
}
@Override
protected Void doInBackground(Void... params) {
// Create an array
localarraylist = new ArrayList<HashMap<String, String>>();
// Retrieve JSON Objects from the given URL address
StringBuffer sb = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(getAssets().open("localfood.txt")));
String temp;
while ((temp = br.readLine()) != null)
sb.append(temp);
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
myjsonstring = sb.toString();
try{
JSONObject jsonObj = new JSONObject(myjsonstring);
JSONArray Attendance = jsonObj.getJSONArray("events");
for (int i = 0; i < Attendance.length(); i++)
{
JSONObject a = Attendance.getJSONObject(i);
String Name = a.getString("Name");
String time = a.getString("Time");
String ingredients = a.getString("ingredients");
String Serves = a.getString("Serves");
String descr = a.getString("Description");
HashMap<String, String> contact = new HashMap<String, String>();
// adding each child node to HashMap key => value
contact.put("Name", Name);
contact.put("Time", time);
contact.put("ingredients", ingredients);
contact.put("Serves", Serves);
contact.put("Description", descr);
// adding contact to contact list
localarraylist.add(contact);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args) {
Toast.makeText(getApplicationContext(),"Loading local data dishes, please connect o internet to load new dishes",Toast.LENGTH_LONG).show();
// Locate the listview in listview_main.xml
//setContentView(R.layout.listview_main);
listview = (ListView) findViewById(R.id.listview);
// Pass the results into ListViewAdapter.java
adapter = new ListViewAdapter(JsonLoadSubFirstFirst.this, localarraylist);
// Set the adapter to the ListView
listview.setAdapter(adapter);
// Close the progressdialog
// mProgressDialog.dismiss();
// textView.setVisibility(View.VISIBLE);
pd.dismiss();
super.onPostExecute(args);
}
}