我有一个带有片段的应用程序,其中一个片段加载并解析来自Lan的JSON文件。当局域网服务器可以访问时,一切似乎都可以,但是当无法访问远程主机/ JSON文件时,应用程序崩溃。我试图捕捉到我发现的所有异常,但应用程序仍然崩溃。希望有人能帮我解决这个问题
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Dialog;
import android.support.v4.app.Fragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.TextView;
import android.widget.Toast;
import com.genesysci.leo.R;
import com.genesysci.leo.others.HttpHandler;
public class UrielFragment extends Fragment {
private static final String TAG = HttpHandler.class.getSimpleName();
private static String url = "http://192.168.8.100/Android/jsonData.php";
private ProgressDialog mprocessingdialog;
private TextView tv_welcomeuser, tv_recentupdate;
private ExpandableListAdapter expandableListAdapter;
private ExpandableListView exp_leaseoffer;
private List<String> listDataHeader;
private View rootView;
private HashMap<String, List<String>> listDataChild;
Dialog dialog;
private void save() {
Toast.makeText(getActivity(), R.string.action_save, Toast.LENGTH_LONG).show();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.wellcome_page, container, false);
//tv_welcomeuser = (TextView) rootView.findViewById(R.id.tv_welcomeuser);
//tv_recentupdate = (TextView) rootView.findViewById(R.id.tv_recentupdate);
exp_leaseoffer = (ExpandableListView) rootView.findViewById(R.id.lvExp);
exp_leaseoffer.setGroupIndicator(null);
exp_leaseoffer.setChildIndicator(null);
exp_leaseoffer.setChildDivider(getResources().getDrawable(R.color.black));
exp_leaseoffer.setDividerHeight(0);
new DownloadJason().execute();
return rootView;
}
private class DownloadJason extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
mprocessingdialog = new ProgressDialog(getActivity());
mprocessingdialog.setTitle(" Veuillez patienter...");
mprocessingdialog.setMessage("chargement");
mprocessingdialog.setIndeterminate(false);
mprocessingdialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
listDataHeader = new ArrayList<String>();
HttpHandler jp = new HttpHandler();
String jsonstr = jp.makeServiceCall(url);
Log.d("Json url view", jsonstr);
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
if (jsonstr != null) {
try {
JSONObject jobj = new JSONObject(jsonstr);
JSONArray jarray = jobj.getJSONArray("data");
for (int hk = 0; hk < jarray.length(); hk++) {
JSONObject d = jarray.getJSONObject(hk);
// Adding Header data
listDataHeader.add(d.getString("name"));
// Adding child data for lease offer
List<String> lease_offer = new ArrayList<String>();
lease_offer.add(d.getString("name") + "'s ID is : " + d.getString("id"));
lease_offer.add(d.getString("subject"));
lease_offer.add("Contacts : "+d.getString("phone_number"));
// Header into Child data
listDataChild.put(listDataHeader.get(hk), lease_offer);
}
}
catch (NullPointerException e) {
Log.e(TAG, "Network Error: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
/*if(result == null){
Toast.makeText(getActivity(),"No data found", Toast.LENGTH_LONG).show();
}*/
mprocessingdialog.dismiss();
expandableListAdapter = new com.genesysci.leo.models.Expandable_adapter(getActivity(), listDataHeader, listDataChild);
Log.i("groups", listDataHeader.toString());
Log.i("details", listDataChild.toString());
exp_leaseoffer.setAdapter(expandableListAdapter);
exp_leaseoffer.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return false;
}
});
// Listview Group expanded listener
exp_leaseoffer.setOnGroupExpandListener(new OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
if(groupPosition != previousItem )
exp_leaseoffer.collapseGroup(previousItem );
previousItem = groupPosition;
}
});
exp_leaseoffer.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
// Toast.makeText(getActivity().getApplicationContext(), listDataHeader.get(groupPosition) + " Collapsed", Toast.LENGTH_SHORT).show();
}
});
exp_leaseoffer.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
return false;
}
});
}
@Override
protected void onCancelled() {
// Toast.makeText(getActivity(), "Please Check internet Connection", Toast.LENGTH_SHORT).show();
}
}
public void openDialog() {
dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog);
dialog.setCancelable(false);
TextView m = (TextView) dialog.findViewById(R.id.dialog_info);
m.setText(R.string.dialog_text);
final Button n = (Button) dialog.findViewById(R.id.dialog_cancel);
final Button p = (Button) dialog.findViewById(R.id.dialog_ok);
dialog.show();
n.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
p.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
}
}
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class HttpHandler {
private static final String TAG = HttpHandler.class.getSimpleName();
public HttpHandler() {
}
public String makeServiceCall(String reqUrl) {
String response = null;
try {
URL url = new URL(reqUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// read the response
InputStream in = new BufferedInputStream(conn.getInputStream());
response = convertStreamToString(in);
} catch (MalformedURLException e) {
Log.e(TAG, "MalformedURLException: " + e.getMessage());
} catch (ProtocolException e) {
Log.e(TAG, "ProtocolException: " + e.getMessage());
}catch (NullPointerException e) {
Log.e(TAG, "Network Error: " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
return response;
}
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
11-30 13:41:25.747 19225-19370/com.genesysci.leo I/OpenGLRenderer: Initialized EGL, version 1.4
11-30 13:41:25.833 19225-19225/com.genesysci.leo I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@60d3afe time:280631044
11-30 13:41:29.699 19225-19225/com.genesysci.leo I/Timeline: Timeline: Activity_launch_request id:com.genesysci.leo time:280634910
11-30 13:41:29.940 19225-19225/com.genesysci.leo W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
11-30 13:41:30.165 19225-19225/com.genesysci.leo I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
11-30 13:41:30.627 19225-19225/com.genesysci.leo I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@3117b94 time:280635838
11-30 13:41:39.357 19225-19773/com.genesysci.leo W/System: ClassLoader referenced unknown path: /system/framework/tcmclient.jar
11-30 13:41:42.373 19225-19773/com.genesysci.leo E/HttpHandler: IOException: failed to connect to /192.168.8.100 (port 80): connect failed: EHOSTUNREACH (No route to host)
11-30 13:41:42.385 19225-19773/com.genesysci.leo E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.genesysci.leo, PID: 19225
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.d(Log.java:139)
at com.genesysci.leo.fragment.UrielFragment$DownloadJason.doInBackground(UrielFragment.java:98)
at com.genesysci.leo.fragment.UrielFragment$DownloadJason.doInBackground(UrielFragment.java:77)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
11-30 13:41:42.823 19225-19225/com.genesysci.leo E/WindowManager: android.view.WindowLeaked: Activity com.genesysci.leo.activity.MainActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{b2a72e7 V.E...... R......D 0,0-1026,483} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:372)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:86)
at android.app.Dialog.show(Dialog.java:326)
at com.genesysci.leo.fragment.UrielFragment$DownloadJason.onPreExecute(UrielFragment.java:89)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604)
at android.os.AsyncTask.execute(AsyncTask.java:551)
at com.genesysci.leo.fragment.UrielFragment.onCreateView(UrielFragment.java:72)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案 0 :(得分:0)
错误非常具有描述性java.lang.NullPointerException: println needs a message
。一个空指针导致应用崩溃。
那发生了什么事?
IOException: failed to connect to /192.168.8.100 (port 80): connect failed: EHOSTUNREACH (No route to host)
这次尝试导致makeServiceCall
退出,返回的字符串等于null
。
在AsyncTask
中,您尝试记录方法
Log.d("Json url view", jsonstr);
的返回字符串,在这种情况下是null
引用。
那么解决方案是什么?
在if语句中移动日志消息和依赖jsonstr
的任何内容,以检查它是否不是null
。
if (jsonstr != null) {
Log.d("Json url view", jsonstr);
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
/// ...
} else {
Log.d("Json url view", "Empty");
// Server call failed
}
答案 1 :(得分:0)
好的@Mohamad,它有效,这是最后的片段
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
listDataHeader = new ArrayList<String>();
HttpHandler jp = new HttpHandler();
String jsonstr = jp.makeServiceCall(url);
//Log.d("Json url view", jsonstr);
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
if (jsonstr != null) {
try {
JSONObject jobj = new JSONObject(jsonstr);
JSONArray jarray = jobj.getJSONArray("data");
for (int hk = 0; hk < jarray.length(); hk++) {
JSONObject d = jarray.getJSONObject(hk);
// Adding Header data
listDataHeader.add(d.getString("name"));
// Adding child data for lease offer
List<String> lease_offer = new ArrayList<String>();
lease_offer.add(d.getString("name") + "'s ID is : " + d.getString("id"));
lease_offer.add(d.getString("subject"));
lease_offer.add("Contacts : "+d.getString("phone_number"));
// Header into Child data
listDataChild.put(listDataHeader.get(hk), lease_offer);
}
}
catch (NullPointerException e) {
Log.e(TAG, "Network Error: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
else {
Log.d("Json url view", "Empty");
// Server call failed
}
return null;
}