2016-12-29 38 views
-1

编辑忘了包括实际问题。null return当我应该得到一个<String> **编辑**

Soo我知道我的文件正在返回null,因为我的“GetData()”调用正在流经余下的我的脚本导致错误。但是,我不知道如何防止这种情况。有人能指出我正确的方向吗?

问题 我得到的错误是 Attempt to invoke virtual method 'java.lang.Object[] java.util.ArrayList.toArray()' on a null object reference

从我的理解

当我用线 titles = readRss.titles; 它拉过这个order.ReadRss空响应>的processXML()> GETDATA() 并且因为获取数据是“try”“catch”部分,它将返回xmldoc和null。

当我在我的ProcessXml()内登录时,我可以获得完整的标题列表,但我可以单独记录供稿项目,但是如果我尝试在其外部记录时返回null。

我是什么误解。

ReadRss脚本:

public class ReadRss extends AsyncTask<Void, Void, Void> { 
ArrayList<String>titles; 


BlankFragment context; 
String address="https://www.sciencemag.org/rss/news_current.xml"; 
//ProgressDialog progressDialog; 
ArrayList<FeedItem> feedItems; 
RecyclerView recyclerView; 
URL url; 
public ReadRss(BlankFragment context, RecyclerView recyclerView){ 
    this.recyclerView=recyclerView; 
    this.context=context; 
    // progressDialog = new ProgressDialog(context); 
    // progressDialog.setMessage("Loading..."); 
} 

@Override 
protected void onPreExecute() { 
    //progressDialog.show(); 
    super.onPreExecute(); 
} 



@Override 
public void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    //progressDialog.dismiss(); 


} 

@Override 
public Void doInBackground(Void... voids) { 
    ProcessXml(Getdata()); 
    return null; 
} 


public ArrayList<String> ProcessXml(Document data) { 

    if (data!=null) { 
     titles=new ArrayList<>(); 
     feedItems=new ArrayList<>(); 
     Element root=data.getDocumentElement(); 
     Node channel=root.getChildNodes().item(1); 
     NodeList items=channel.getChildNodes(); 
     for (int i=0;i<items.getLength();i++){ 
      Node currentchild=items.item(i); 
      if (currentchild.getNodeName().equalsIgnoreCase("item")){ 
       FeedItem item=new FeedItem(); 
       NodeList itemchilds=currentchild.getChildNodes(); 
       for (int j=0;j<itemchilds.getLength();j++){ 
        Node current=itemchilds.item(j); 
        if (current.getNodeName().equalsIgnoreCase("title")){ 
         item.setTitle(current.getTextContent()); 
         titles.add(current.getTextContent()); 
        }else if (current.getNodeName().equalsIgnoreCase("description")){ 
         item.setDescription(current.getTextContent()); 
        }else if (current.getNodeName().equalsIgnoreCase("pubDate")){ 
         item.setPubDate(current.getTextContent()); 
        }else if (current.getNodeName().equalsIgnoreCase("link")){ 
         item.setLink(current.getTextContent()); 
        }else if (current.getNodeName().equalsIgnoreCase("media:thumbnail")){ 
         String url=current.getAttributes().item(0).getTextContent(); 
         item.setThumbnailUrl(url); 
        } 

       } 
       feedItems.add(item); 
       Log.d("hello", item.getTitle()); 


      } 

     } 
    } 

    return titles; 


} 

public Document Getdata(){ 
    try{ 

     url = new URL(address); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     InputStream inputStream = connection.getInputStream(); 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
     Document xmlDoc = builder.parse(inputStream); 
     return xmlDoc; 
    } catch (Exception e){ 
     e.printStackTrace(); 

    } 


    return null; 
} 




} 

BlankFragment脚本中调用的标题。

public class BlankFragment extends Fragment { 
ArrayList<FeedItem>feedItems; 
ArrayList<String>titles; 

String address="https://www.sciencemag.org/rss/news_current.xml"; 
URL url; 



public BlankFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@TargetApi(Build.VERSION_CODES.N) 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_blank, container, false); 

    RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view); 
    rv.setHasFixedSize(true); 

    ReadRss readRss = new ReadRss(this, rv); 
    readRss.getClass(); 




    titles = readRss.titles; 



    String[] display_titles = (String[]) titles.toArray(); 











    //Document data = readRss.Getdata(); 
    //ArrayList<FeedItem> feedItems = readRss.ProcessXml(data); 



    MyAdapter adapter = new MyAdapter(display_titles); 
    rv.setAdapter(adapter); 

    LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    rv.setLayoutManager(llm); 

    return rootView; 
} 




} 
+0

我的回答下面有帮助你吗?你可以通过记录当'标题'被实例化和使用时间来测试它 - 它可以让你知道哪一个会先发生 –

+0

对不起,假期让我失去了。我现在刚刚回到这个项目。谢谢,它确实帮助了我很多。 – Jahi

回答

0

这是一个竞赛条件,虽然它听起来像一条路总是赢得比赛。 您正在使用2个主题;

  1. 线程1(也许是UI线程) - 创建ReadRss - 读 '头衔'
  2. 后台线程 - 执行的GetData() - 执行的processXML() - 设置 '标题'

如果主线程在后台线程实例化之前到达'标题'点 - 然后'标题'将为空。

也许在创建AsyncTask之后,您可以继续创建视图 - 显示标题所在的“加载”。然后,当AsyncTask完成时,它可以更新标题视图 - onPostExecute()。

+0

这帮助我意识到我做错了什么,但是,我不知道如何解决它。至少这样我就能更好地理解需要做什么。 – Jahi

相关问题