2016-03-22 9 views
0

この質問はこのフォーラムで数回質問されましたが、私はそれらを読んだが、彼らのどれも私のために少なくとも働いていなかった。私はこれをほぼ2日間結んでいますが、線形レイアウトを初期化してNPEをエスケープする方法を理解できませんでした。私はフラグメントを使用しておらず、アクティビティでレイアウトマネージャを初期化したいと考えています。リサイクルビューアリニアレイアウトマネージャーでヌルポインター例外

以下は私のコードの重要な部分ですが、残りのコードはアダプターとXMLについて同じですので、ここで書き留めません。しかし必要な場合は、私もそれを提供します。

public class MainNews extends AppCompatActivity { 

    public RecyclerViewAdapter recyclerViewAdapter; 
    Toolbar toolbar; 
    private String[] inputStream; 
    public RecyclerView recyclerView; 
    //ArrayList<Data> dataList; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_news); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     String newsMain = "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"; 
     new JSONAsync(getApplicationContext()).execute(newsMain); 

     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this, JSONAsync.dataArray); 
     recyclerView.setAdapter(recyclerViewAdapter); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     return super.onOptionsItemSelected(item); 
    } 

    ///////////////////////////////////////////////////// 


    public static class JSONAsync extends AsyncTask<String, String, Boolean> { 

     Context context; 
     public static List<Data> dataArray; 

     public JSONAsync(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected Boolean doInBackground(String... params) { 
      try { 
       return downloadUrl(params[0]); 
      } catch (IOException e) { 
       return false; 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     public boolean downloadUrl(String myurl) throws IOException,JSONException { 
      InputStream is = null; 
      int response; 

      try { 
       URL url = new URL(myurl); 
       HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
       conn.setRequestMethod("GET"); 
       conn.setDoInput(true); 
       // Starts the query 
       conn.connect(); 
       response = conn.getResponseCode(); 
       is = conn.getInputStream(); 
       if (response == 200) { 
        String responseBody = convertStreamToString(conn.getInputStream()); 
        JSONArray jArray = new JSONArray(responseBody); 
        // JSONArray jArray = new JSONArray(is); 
        for (int i = 0; i < jArray.length(); i++) { 
         JSONObject jobj = jArray.getJSONObject(i); 
         Data data = new Data(); 
         data.setId(jobj.getInt("id")); 
         data.setHeading(jobj.getString("heading")); 
         data.setBrief(jobj.getString("brief")); 
         data.setDate(jobj.getString("date")); 
         dataArray.add(data); 
        } 
        return true; 
       } else return false; 

      } finally { 
       if (is != null) { 
        is.close(); 
       } 
      } 

     } 

     public String convertStreamToString(InputStream is) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      try { 
       while ((line = reader.readLine()) != null) { 
        sb.append(line).append("\n"); 
       } 
      } catch (IOException e) { 
      } finally { 
       try { 
        is.close(); 
       } catch (IOException e) { 
       } 
      } 

      return sb.toString(); 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 

      if (result == true) { 
       Toast.makeText(context, "Data Fetched, now do some work with it AH", Toast.LENGTH_LONG).show(); 
      } else 
       Toast.makeText(context, "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

     } 
     } 
     } 

ここにはlogcatがあります。

FATAL EXCEPTION: AsyncTask #1 
    Process: admin.myproject, PID: 11032 
    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: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference 
    at admin.myproject.MainNews$JSONAsync.downloadUrl(MainNews.java:128) 
    at admin.myproject.MainNews$JSONAsync.doInBackground(MainNews.java:90) 
    at admin.myproject.MainNews$JSONAsync.doInBackground(MainNews.java:78) 
    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) enter code here 

P.S:私が作ったJSONAsyncクラスの静的/非静的および他のものは変化しますがナッシングが働きました。

ご協力いただければ幸いです。

+0

次のようにそれを行うことができますしてみてください? –

+0

フルlogcatが必要です –

答えて

1

dataArrayが初期化されていません。

public static List<Data> dataArray = new Arraylist(); 
+0

うーん、天才:D ...そして私はどの言葉を私のために使うべきですか? XMLは私が望むように完全に膨張していないので、あなたのソリューションはまだ障壁を取り除いています。ありがとう。 – Umair

1

あなたが追加しようとしている配列リストは決して初期化されません。値を追加する前に最初に初期化する必要があります。

この

public static List<Data> dataArray = new Arraylist(); 

またはあなたがあなたのログを投稿することができ、また

List<Data> dataArray; 

public boolean downloadUrl(String myurl) throws IOException,JSONException { 
    InputStream is = null; 
    int response; 
    dataArray = new List<Data>(); 

    try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     // Starts the query 
     conn.connect(); 
     response = conn.getResponseCode(); 
     is = conn.getInputStream(); 
     if (response == 200) { 
      String responseBody = convertStreamToString(conn.getInputStream()); 
      JSONArray jArray = new JSONArray(responseBody); 
      // JSONArray jArray = new JSONArray(is); 
      for (int i = 0; i < jArray.length(); i++) { 
       JSONObject jobj = jArray.getJSONObject(i); 
       Data data = new Data(); 
       data.setId(jobj.getInt("id")); 
       data.setHeading(jobj.getString("heading")); 
       data.setBrief(jobj.getString("brief")); 
       data.setDate(jobj.getString("date")); 
       dataArray.add(data); 
      } 
      return true; 
     } else return false; 

    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 
関連する問題