2015-11-11 117 views
0

我试图从URL获取JSON代码。
当我尝试在浏览器上打开时,URL正常工作。
但是当我运行的应用程序,它崩溃,并显示此日志:
java.lang.RuntimeException:执行doInBackground()时发生错误

11-11 21:06:30.489 25670-25695/app.com.example.android.popularmovies E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
Process: app.com.example.android.popularmovies, PID: 25670 
java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:300) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 
Caused by: java.lang.NullPointerException 
     at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 
     at org.json.JSONTokener.nextValue(JSONTokener.java:94) 
     at org.json.JSONObject.<init>(JSONObject.java:155) 
     at org.json.JSONObject.<init>(JSONObject.java:172) 
     at app.com.example.android.popularmovies.MainActivityFragment.getJSONResults(MainActivityFragment.java:137) 
     at app.com.example.android.popularmovies.MainActivityFragment.getStringArrayFromJson(MainActivityFragment.java:94) 
     at app.com.example.android.popularmovies.MainActivityFragment.access$1100(MainActivityFragment.java:30) 
     at app.com.example.android.popularmovies.MainActivityFragment$FetchDataClass.doInBackground(MainActivityFragment.java:264) 
     at app.com.example.android.popularmovies.MainActivityFragment$FetchDataClass.doInBackground(MainActivityFragment.java:249) 
     at android.os.AsyncTask$2.call(AsyncTask.java:288) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
            at java.lang.Thread.run(Thread.java:841) 


这是因为它在工作,我不记得任何更改很奇怪。
这里是我的AsyncTask:

public class FetchDataClass extends AsyncTask<String, Void, String[]>{ 
    private final String IMG_URL = "http://image.tmdb.org/t/p/w185/"; 
    private final String JSON_PATH_ITEM = "poster_path"; 

    @Override 
    protected String[] doInBackground(String... params){ 
     Uri.Builder builder = new Uri.Builder(); 
     builder.scheme("http") 
       .authority("api.themoviedb.org") 
       .appendPath("3") 
       .appendPath("discover") 
       .appendPath("movie") 
       .appendQueryParameter("sort_by", params[0]) 
       .appendQueryParameter("api_key", API_KEY); 
     jsonCode = dataFetcher(builder); 
     return getStringArrayFromJson(jsonCode, JSON_PATH_ITEM); 
    } 

    @Override 
    protected void onPostExecute(String[] result){ 
     if(result != null){ 
      adapter.clear(); 
      for(String dataStr : result) { 
       String imgURL = dataStr; 
       if(dataStr != "null") { 
        imgURL = IMG_URL + dataStr; 
       } 
       adapter.add(imgURL); 
      } 
     } 
    } 
} 

与方法 “dataFecther”:

private String dataFetcher(Uri.Builder uriBuilder){ 
    HttpURLConnection urlConnection = null; 
    BufferedReader reader = null; 

    String jsonDataStr = null; 
    try{ 
     String myURL = uriBuilder.build().toString(); 
     URL url = new URL(myURL); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     try{ 
      urlConnection.connect(); 
     }catch (NullPointerException e){ 
      return null; 
     } 

     InputStream inputStream = urlConnection.getInputStream(); 
     StringBuffer buffer = new StringBuffer(); 

     if(inputStream == null){ 
      return null; 
     } 

     reader = new BufferedReader(new InputStreamReader(inputStream)); 

     if(buffer.length() == 0){ 
      return null; 
     } 
     jsonDataStr = buffer.toString(); 
    }catch (IOException e){ 
     return null; 
    }finally { 
     if(urlConnection == null){ 
      urlConnection.disconnect(); 
     } 
     if(reader != null){ 
      try { 
       reader.close(); 
      }catch (final IOException e){ 
       return null; 
      } 
     } 
    } 
    return jsonDataStr; 
} 


private String[] getStringArrayFromJson(String json, String name){ 
    int resultLength = getJSONResults(json).length(); 
    String[] strArray = new String[resultLength]; 

    for(int i = 0; i < resultLength; i++){ 
     strArray[i] = getStringFromJson(json, i, name); 
    } 

    return strArray; 
} 

private String getStringFromJson(String json, int index, String name){ 
    String jsonStr = null; 
    try { 
     jsonStr = getJSONResults(json) 
       .getJSONObject(index) 
       .getString(name); 
    }catch (JSONException e){ 
     return null; 
    } 
    if(jsonStr == "null" && name != "poster_path"){ 
     jsonStr = "Not avaliable."; 
    } 
    return jsonStr; 
} 
    private JSONArray getJSONResults(String json){ 
    final String JSON_RESULTS = "results"; 
    JSONArray results = null; 

    try { 
     JSONObject jsonObject = new JSONObject(json); 
     results = jsonObject.getJSONArray(JSON_RESULTS); 
    }catch (JSONException e){ 
     return null; 
    } 
    return results; 
} 



有谁知道我怎么能解决这个问题?谢谢!

+0

您没有共享实际空指针发生方法的代码 - getJSONResults() – shiladitya

+0

@shiladitya哦,我会更新问题。 – Cas

回答

0

我认为这是方法dataFetcher()返回null。你应该检查它。

+0

如果是这样,我怎么能从该URL获取JSONCode? – Cas

+0

我建议你调试dataFetcher方法。找出它为什么返回null。 –

相关问题