应用未响应

时间:2016-01-20 18:10:56

标签: java android

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

这是我的代码 的 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,然后我为方法getInfo()调用DataProvider类;

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

先谢谢

2 个答案:

答案 0 :(得分:1)

如果您的应用没有响应,则表示正在UI线程中执行某些操作。

如果您执行以下步骤,您可以找到正在执行的代码段(假设您使用的是Android Studio,我们从左上角的菜单开始):

运行 - &gt;

将调试器附加到android进程 - &gt;

在相应设备上选择流程,按确定 - >

按下底栏上的“调试”(如果它自己没有显示) - &gt;

暂停程序(从左侧) - &gt;

在“frames”中找到名称中包含“main”的那个(它是你的主线程,应该是“RUNNING”) - &gt;

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

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

当你发现你的节目在哪里时,我希望你能够解决你的问题。

答案 1 :(得分:0)

JSONTask json = new JSONTask();
try {
    //json.get();
    MoviesDetails =  json.get();

您刚刚使AsyncTask同步。不要那样做。

new JSONTask().execute("http://pruthvi.co/tests/ems/machine-query.php");保留,并从onPostExecute正确处理回复。

例如,How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

use Volley,甚至是Retrofit,因为您正在处理JSON。