2016-01-20 95 views
1

好吧,这是我的问题。我试图通过从服务器获取数据来创建一个可扩展的列表视图。但我的应用程序没有响应。应用程序没有响应

这里是我的代码 MainActivity.java

public class MainActivity extends AppCompatActivity { 
    HashMap<String, List<String>> Movies_category; 
    List<String> Movies_list; 
    ExpandableListView Exp_list; 
    MoviesAdapter adapter; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Exp_list = (ExpandableListView) findViewById(R.id.exp_list); 
     Movies_category = DataProvider.getInfo(); 
     Movies_list = new ArrayList<String>(Movies_category.keySet()); 
     adapter = new MoviesAdapter(this, Movies_category, Movies_list); 
     Exp_list.setAdapter(adapter); 

    } 

} 

这里的代码DataProvider.java

public class DataProvider { 
    private static HashMap<String,List<String>> MoviesDetails; 

    public static HashMap<String, List<String>> getInfo(){ 
     String[] SecondArray = {"One","Two","Three"}; 
     String[] Category = {"Action_Movies","Romantic_Movies","Horror_Movies"}; 
     new JSONTask().execute("http://pruthvi.co/tests/ems/machine-query.php"); 
     JSONTask json = new JSONTask(); 
     try { 
      //json.get(); 
      MoviesDetails = json.get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return MoviesDetails; 
    } 


    public static class JSONTask extends AsyncTask<String,String,HashMap<String,List<String>>> { 


     @Override 
     protected HashMap<String,List<String>> doInBackground(String... params) { 
      HttpURLConnection connection = null; 
      BufferedReader reader = null; 

      try { 
       URL url = new URL(params[0]); 
       connection = (HttpURLConnection)url.openConnection(); 
       connection.connect(); 
//     connecting to the url 

       //Reading the data in bytes stream 
       InputStream stream = connection.getInputStream(); 
       reader = new BufferedReader(new InputStreamReader(stream)); 
//Reading the data by creating a buffer 
       StringBuffer buffer = new StringBuffer(); 
       String line=""; 
       while((line = reader.readLine())!= null){ 
        buffer.append(line); 
       } 

       String finalJson = buffer.toString(); 
       JSONObject parentObject = new JSONObject(finalJson); 

       List<String> list = new ArrayList<String>(); 
       JSONArray array = parentObject.getJSONArray("machine-array"); 
       for(int i = 0 ; i < array.length() ; i++){ 
        list.add(array.getJSONObject(i).getString("name")+"\n"); 
       } 

       HashMap<String,List<String>> map = new HashMap<String,List<String>>(); 
       for(int ij=0; ij<list.size();ij++){ 
        map.put(list.get(ij),list); 
       } 


       return map; 
       //return list.toArray(new String[list.size()]); 
//     setting text view from the url 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } finally{ 
       if(connection !=null) { 
        connection.disconnect(); 
       } 

       try { 
        if (reader != null) 
        { 
         reader.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(HashMap<String,List<String>> result) { 
      super.onPostExecute(result); 
      HashMap<String, List<String>> MoviesDetails = new HashMap<String, List<String>>(); 
      String[] SecondArray = {"One","Two","Three","four","five","six"}; 
      String[] resultArray = (String[]) result.values().toArray(); 

      for(int j=0; j<resultArray.length;j++) { 
       MoviesDetails.put(resultArray[j], new ArrayList<String>()); 
      } 

      for(int k=0;k<resultArray.length;k++) 
      { 
       for (int i=0;i<SecondArray.length; i++) { 
        MoviesDetails.get(resultArray[k]).add(SecondArray[i]); 
       } 
      } 
     } 
    } 

} 

有人能帮助我,我要去的地方错了吗? 在onCreate方法中,我获取expandableListView,然后调用DataProvider类获取方法getInfo();

我怀疑Dataprovider类需要很长时间才能执行。 此外,有人可以帮助我如何调试相同的执行时间。

由于提前

+0

你知道你的应用挂在哪行代码吗?代码中有几个for循环和while循环,这是调查代码挂起时的主要位置。尝试把一个System.out。的println( “你好”);在循环的每一步中查看循环可能失控的位置。用不同的字符串标识每个循环。 – bakoyaro

+0

@bakoyaro好的!所以我试着做你的建议。所有的工作都很好,直到doInBackground方法。系统打印返回的hashMap值。但是,当我尝试捕获并在onPostExecute打印结果。没有打印。你能帮我解决这个问题吗? –

+0

尝试在onPostExecute方法的第一行放置System.out.println()。如果消息未打印,则系统不会调用该方法。一旦你确定你正在调用该方法,你可以在每行上放一个System.out.println()来查看代码的执行位置。 – bakoyaro

回答

1

如果您的应用程序没有响应,这意味着,一些被在UI线程中执行。

你可以找到的代码段,这是目前正在执行,如果执行以下步骤(假设你正在使用Android Studio中,我们从左上角的菜单中启动):

运行 - >

附加调试器机器人过程 - >

选择过程相应的设备,按下OK键 - >

按“调试”底栏上(如果它没有显示出来本身) - >

暂停程序(左) - >

在“帧”发现其中包含在其名称中的“主”的一个

(这是你的主线程,这应该是“RUNNING”) - >

选择一个,所以你会看到它的堆栈跟踪。

在堆栈顶部,您将看到代码的位置,您的程序现在保存在该位置。

当你发现你的程序在哪里举行时,我希望你能解决你的问题。