简体   繁体   English

线程联网导致空指针异常

[英]Thread networking causing null pointer exceptions

As I am learning networking in the android area, I have encountered a problem that is only present on device testing (not emulator testing). 当我在android领域学习网络时,遇到了仅在设备测试(不是模拟器测试)上出现的问题。

Ran the app on the device and I got a network error, so I created a new thread for the network task like so (using a class to download and return a JSON object). 在设备上运行该应用程序后,出现网络错误,因此我为网络任务创建了一个新线程,如下所示(使用类下载并返回JSON对象)。

public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static JSONArray jArray = null;
    static String json = "";
    // constructor
            public JSONParser() {
        }
    public JSONObject getJSONFromUrl(final String url) {
        // Making HTTP request
        new Thread(new Runnable(){
            @Override
            public void run() {

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

            }
        }).start();

        return jObj;
    }
}

Now, back in my main code I instantiate the object like so: 现在,回到我的主代码中,我实例化对象是这样的:

JSONParser j = new JSONParser();
JSONObject jArray = j.getJSONFromUrl(url); // url being a predefined variable

The problem here now is jArray is null since making it work on a different thread - I am wondering at the moment if the thread is (due to network connection) not loading the data before execution of the code. 现在的问题是jArray为空,因为它使它可以在不同的线程上工作-我想知道该线程是否由于执行网络连接而没有在执行代码之前加载数据。

Am I right in thinking this is the problem or is there a possibility of another issue somewhere? 我是否以为这是问题是对的,还是在某个地方有另一个问题的可能性?

I will paste here the full code and also the stack trace: 我将在此处粘贴完整的代码以及堆栈跟踪:

Where GlobalSettings.java is called from FragmentTab3.java : FragmentTab3.java调用GlobalSettings.java地方:

try{
        newsText = globalSettings.getNews();
    }catch (Exception e){
        e.printStackTrace();
    }

GlobalSettings.java

public String getNews()
    {
        // will be a string with news content
        String valueToReturn = null;

        try{
            JSONParser j = new JSONParser();
            JSONObject jArray = j.getJSONFromUrl(url);

            //Log.i("log_tag_one", jArray.toString());

            int jLen = jArray.length();
            String jLenStr = Integer.toString(jLen);

            //Log.i("log_tag_two", jLenStr);

            String jsonvalues = null;


            for (int i = 0; i < jArray.length(); i++) {
                JSONObject json_data = jArray;
                jsonvalues = json_data.getString("FeaturedNews");
                // .. get all value here
                //Log.i("DARE", jsonvalues);
            }

            // turn string -> array jsonvalues
            String[] jsonForIteration = jsonvalues.split(",");
            //JSONObject jValues = jsonvalues;

            // Position 4 is always going to be the news text
            //Log.i("LOG FROM ENUMERATION ==>>", jsonForIteration[4]);

            valueToReturn = jsonForIteration[4];

        } catch (Exception ex) {
            Log.e("log_tag", "Error getJSONfromURL " + ex.toString());
        }

        return valueToReturn;
    }

    public String[][] getScrollingItems() {

        // will be a object with images
        String[][] data = new String[6][6];

        try {
            JSONParser j = new JSONParser();
            JSONObject jArray = j.getJSONFromUrl(urlForImages);

            // define variables for the switch below which at the moment produces the
            // individual objects for display

            JSONArray anotherJson = null;
            JSONObject object1;

            try {
                anotherJson = jArray.getJSONArray("FeaturedLinks");
            } catch (Exception e) {
                e.printStackTrace();
            }

            for (int i = 0; i < anotherJson.length(); i++) {

                object1 = anotherJson.getJSONObject(i);

                data[i][0] = object1.getString("Image");
                data[i][1] = object1.getString("Link");

            }

            // end initial try
            // TOO MANY DAMN TRYS! :(
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    } // end method

Stack Trace 堆栈跟踪

09-22 15:23:40.102    6500-6519/packageName.com.packageNameEdited E/Version﹕ 231, Applause client library for Android v2.3.1
09-22 15:23:40.112    6500-6519/packageName.com.packageNameEdited E/Version﹕ 1, 0.3.3
09-22 15:23:40.192    6500-6500/packageName.com.packageNameEdited E/log_tag﹕ Error getJSONfromURL java.lang.NullPointerException
09-22 15:23:40.192    6500-6500/packageName.com.packageNameEdited W/System.err﹕ java.lang.NullPointerException
09-22 15:23:40.192    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.FragmentTab3.onCreateView(FragmentTab3.java:46)
09-22 15:23:40.192    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Fragment.performCreateView(Fragment.java:1699)
09-22 15:23:40.192    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.BackStackRecord.run(BackStackRecord.java:682)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Activity.performStart(Activity.java:5126)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:145)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5099)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
09-22 15:23:40.202    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ java.lang.NullPointerException
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.GlobalSettings.getScrollingItems(GlobalSettings.java:81)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.FragmentTab3.onCreateView(FragmentTab3.java:65)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Fragment.performCreateView(Fragment.java:1699)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.BackStackRecord.run(BackStackRecord.java:682)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Activity.performStart(Activity.java:5126)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:145)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5099)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ java.lang.NullPointerException
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.GlobalSettings.getScrollingItems(GlobalSettings.java:86)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.FragmentTab3.onCreateView(FragmentTab3.java:65)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Fragment.performCreateView(Fragment.java:1699)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.BackStackRecord.run(BackStackRecord.java:682)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Activity.performStart(Activity.java:5126)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
09-22 15:23:40.222    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:145)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5099)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40d44ae0)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited E/ApplauseUncaughtExceptionHandler﹕ Applause intercepted uncaught exception: java.lang.RuntimeException -> Unable to start activity ComponentInfo{packageName.com.packageNameEdited/packageName.com.packageNameEdited.MyActivity}: java.lang.NullPointerException: println needs a message
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ java.lang.RuntimeException: Unable to start activity ComponentInfo{packageName.com.packageNameEdited/packageName.com.packageNameEdited.MyActivity}: java.lang.NullPointerException: println needs a message
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2186)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:145)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5099)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
09-22 15:23:40.232    6500-6500/packageName.com.packageNameEdited W/System.err﹕ Caused by: java.lang.NullPointerException: println needs a message
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.util.Log.println_native(Native Method)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.util.Log.i(Log.java:159)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at packageName.com.packageNameEdited.FragmentTab3.onCreateView(FragmentTab3.java:66)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Fragment.performCreateView(Fragment.java:1699)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.BackStackRecord.run(BackStackRecord.java:682)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.Activity.performStart(Activity.java:5126)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited W/System.err﹕ ... 11 more
09-22 15:23:40.242    6500-6500/packageName.com.packageNameEdited I/ApplauseClient﹕ Reporting crash to Applause.
09-22 15:23:40.252    6500-6500/packageName.com.packageNameEdited E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{packageName.com.packageNameEdited/packageName.com.packageNameEdited.MyActivity}: java.lang.NullPointerException: println needs a message
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2186)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
            at android.app.ActivityThread.access$600(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5099)
            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:803)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException: println needs a message
            at android.util.Log.println_native(Native Method)
            at android.util.Log.i(Log.java:159)
            at packageName.com.packageNameEdited.FragmentTab3.onCreateView(FragmentTab3.java:66)
            at android.app.Fragment.performCreateView(Fragment.java:1699)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
            at android.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
            at android.app.Activity.performStart(Activity.java:5126)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
            at android.app.ActivityThread.access$600(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5099)
            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:803)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
            at dalvik.system.NativeStart.main(Native Method)

Edit 1: onCreateView for FragmentTab3.java : 编辑1: FragmentTab3.java onCreateView

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tabhome, container, false);


        // get the news for main text
        GlobalSettings globalSettings = new GlobalSettings();

        String newsText = "?";

        try{
            newsText = globalSettings.getNews().replace("\\n", System.getProperty("line.separator"));
        }catch (Exception e){
            e.printStackTrace();
        }


        TextView newsTextArea = (TextView) view.findViewById(R.id.newsTextView);

        newsTextArea.setSingleLine(false);
        newsTextArea.setMinLines(2);

        String[][] imageArray = globalSettings.getScrollingItems();
        Log.i("Image data at: --> ", imageArray[2][1]);

        newsTextArea.setText(newsText);


        // add images and links(?)

        // image one
        for (int i = 0; i < 3; i++){

            LinearLayout lv = (LinearLayout) view.findViewById(R.id.insideScroll);
            HorizontalScrollView sv = (HorizontalScrollView) view.findViewById(R.id.latestScroller);
            final ImageViewWithURL iv = new ImageViewWithURL(view.getContext());

            try {
                // set the URL of the image
                iv.setURL(imageArray[i][1]);
                Bitmap bmp = BitmapFactory.decodeStream(new URL(imageArray[i][0]).openStream());
                iv.setImageBitmap(bmp);

                iv.setOnClickListener(new View.OnClickListener(){
                    @Override
                public void onClick(View v)
                    {
                        //Log.i("Debug inside:", iv.getURL());
                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(iv.getURL()));
                        startActivity(browserIntent);
                    }
                });

            }catch (Exception e)
            {
                e.printStackTrace();
            }

            lv.addView(iv);
        } // end for

        return view;
    }

Am I right in thinking this is the problem or is there a possibility of another issue somewhere? 我是否以为这是问题是对的,还是在某个地方有另一个问题的可能性?

I think you are completely wrong. 我认为你是完全错误的。

According to the stacktrace, the NPE is caused by your logging . 根据堆栈跟踪,NPE是由您的日志记录引起的 Read the exception message!!! 阅读异常消息!!!

  09-22 15:23:40.232 .../packageName.com.packageNameEdited W/System.err﹕ 
      Caused by: java.lang.NullPointerException: println needs a message
  09-22 15:23:40.242 .../packageName.com.packageNameEdited W/System.err﹕ 
          at android.util.Log.println_native(Native Method)

The offending logger call is in a method called onCreateView ... which you haven't shown us. 有害的记录器调用在一个名为onCreateView ...的方法中,您没有显示给我们。


UPDATE UPDATE

At @Mark W's prompting, I came back to this Question, and ... yes ... he is correct. 在@Mark W的提示下,我回到了这个问题,……是的,他是正确的。 Once you get past the immediate cause of the NPE, the fundamental cause of your problem is in getJSONFromUrl . 一旦超过了NPE的直接原因,那么问题的根本原因就在getJSONFromUrl

The way the code is written at the moment, it is pretty much inevitable that getJSONFromUrl will return null . 目前编写代码的方式, getJSONFromUrl将不可避免地返回null What it does is to create and start a thread that is going to fetch and parse some JSON from a remote site. 它的作用是创建并启动一个线程,该线程将从远程站点获取并解析一些JSON。 But instead of waiting for the thread to complete, the getJSONFromUrl method is going to immediately return the value in jObj . 但是,无需等待线程完成, getJSONFromUrl方法将立即返回jObj的值。 But that is going to be null at that point in time. 但这在那时将是null

Obviously, if getJSONFromUrl is going to return the JSON, it has to wait for the thread to complete. 显然,如果getJSONFromUrl将返回JSON,则它必须等待线程完成。 But that defeats the (true) purpose of doing the fetch on a separate thread ... because waiting will block the event listener thread, making your app non-responsive while the JSON is being fetched. 但这违反了在单独的线程上进行提取的(true)目的...因为等待将阻止事件侦听器线程,从而使您的应用在获取JSON时无响应。

There are other problems with the implementation of getJSONFromUrl as well: getJSONFromUrl的实现还存在其他问题:

  • JSONParser declares some static variables that are used to communicate between the two threads. JSONParser声明了一些用于在两个线程之间进行通信的static变量。 But suppose that the main (event listener) thread calls getJSONFromUrl two times in rapid succession. 但是,假设主线程(事件侦听器)快速连续两次调用getJSONFromUrl Then you are likely to have two threads fetching JSON and assigning it to the same jObj variable. 然后,您可能会有两个线程获取JSON并将其分配给相同的 jObj变量。 That is clearly wrong. 这显然是错误的。

  • Assuming that you get the variable sorted out, you still have the problem that two threads that communicate via a shared variable need to be properly synchronized ... or else you are liable to get memory anomalies. 假设您已整理好变量,则仍然存在一个问题,即通过共享变量进行通信的两个线程需要正确同步...否则,您很可能会出现内存异常。

All in all, there are lots of problems at lots of levels with your multi-threading. 总而言之,多线程在许多层次上都存在很多问题。 I'd recommend that follow @Christian W's advice in the comment above: 我建议在上面的评论中遵循@Christian W的建议:

  • On Android, it is better to use AsyncTasks rather than threads. 在Android上,最好使用AsyncTasks而不是线程。 They are easier to use. 它们更易于使用。

  • If you want to persist with using threads, you need to read up on how to do multi-threading properly in Java. 如果要坚持使用线程,则需要阅读有关如何在Java中正确执行多线程的信息。 Try the Oracle Java Tutorial. 试试Oracle Java教程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM