Android - App无法访问远程json主机/文件时崩溃

时间:2016-11-30 14:06:56

标签: android json android-fragments android-asynctask httphandler

我有一个带有片段的应用程序,其中一个片段加载并解析来自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();
            }
        });
    }
}

HttpHandler的

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();
    }
}

logcat的

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)

2 个答案:

答案 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;
        }