Android 加载listview活动需要很长时间,并在显示之前显示黑屏

Android 加载listview活动需要很长时间,并在显示之前显示黑屏,android,Android,我创建了一个应用程序,该应用程序从服务器上获取带有AsyncTask的JSON。当用户单击按钮时,应用程序启动新活动并从服务器下载数据,并在列表视图中显示为项目。问题是当我打开新的活动时加载时间太长。当按下按钮时,应用程序冻结约1或2秒,然后再显示黑屏2/3秒。之后会显示活动,但速度非常慢。每次用户滚动或按下按钮以显示自定义适配器的更多选项时,它都会冻结。有没有办法让应用程序更流畅?下载的Json数据只是简单的JSONArray,带有JSONObjects,它有两个字符串值和一种HTML格式。这

我创建了一个应用程序,该应用程序从服务器上获取带有
AsyncTask
的JSON。当用户单击按钮时,应用程序启动新活动并从服务器下载数据,并在
列表视图中显示为项目。问题是当我打开新的
活动时
加载时间太长。当按下按钮时,应用程序冻结约1或2秒,然后再显示黑屏2/3秒。之后会显示活动,但速度非常慢。每次用户滚动或按下按钮以显示自定义适配器的更多选项时,它都会冻结。有没有办法让应用程序更流畅?下载的Json数据只是简单的
JSONArray
,带有
JSONObjects
,它有两个字符串值和一种HTML格式。这3个值将显示给用户

自定义适配器类的一部分

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        SuggestionList suggestionList = getItem(position);
        int actualPosition = 0;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.sugestion_list, parent, false);
        }
        final Button suggestionsButton = (Button) convertView.findViewById(R.id.suggestionsMore);
        final TextView suggestionNumber = (TextView) convertView.findViewById(R.id.sugestionNumber);
        final TextView suggestionDescription = (TextView) convertView.findViewById(R.id.suggestionDescription);
        final ImageView bio = convertView.findViewById(R.id.sugestionBio);
        final ImageView block = convertView.findViewById(R.id.sugestionBlock);
        final ImageView call = convertView.findViewById(R.id.sugestionCall);
...
        final Animation slideUp = AnimationUtils.loadAnimation(getContext(), R.anim.slideup);
        final Animation slideDown = AnimationUtils.loadAnimation(getContext(), R.anim.slidedown);
        final Handler handler = new Handler();
        suggestionsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (bioSuggestions.getVisibility() == View.GONE) {
                    bio.setVisibility(View.VISIBLE);
                    block.setVisibility(View.VISIBLE);
                    call.setVisibility(View.VISIBLE);
                    bioSuggestions.startAnimation(slideUp);
                    blockSuggestions.startAnimation(slideUp);
                    callSuggestions.startAnimation(slideUp);
                } else if (bioSuggestions.getVisibility() == View.VISIBLE) {
                    bioSuggestions.startAnimation(slideDown);
                    blockSuggestions.startAnimation(slideDown);
                    callSuggestions.startAnimation(slideDown);
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            bio.setVisibility(View.GONE);
                            block.setVisibility(View.GONE);
                            call.setVisibility(View.GONE);
                        }
                    }, 300);
                }
            }
        });

        if (actualPosition != position) {
            if (bio.getVisibility() == View.VISIBLE) {
                bio.setVisibility(View.GONE);
                block.setVisibility(View.GONE);
                call.setVisibility(View.GONE);
            }

            actualPosition = position;

        }

        JSONObject jsonValSuggestions = new getSugestions().sugestionsDetails(position, "suggestions");

        try {
            final String name = jsonValSuggestions.getString("client_name");
            final String num = jsonValSuggestions.getString("client_number");
            final String description = jsonValSuggestions.getString("client_description");

            bio.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionsDetails = new Intent(view.getContext(), SuggestionsDetails.class);

                    suggestionsDetails.putExtra("client_number", num);
                    suggestionsDetails.putExtra("client_name", name);
                    suggestionsDetails.putExtra("client_description", description);
                    activity.startActivityForResult(suggestionsDetails, position);


                }
            });

            block.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionBlock = new Intent(view.getContext(), BlockSuggestionsActivity.class);

                    activity.startActivity(suggestionBlock);

                }

            });

            call.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionCall = new Intent(view.getContext(), CallSuggestionActivity.class);

                    suggestionCall.putExtra("client_number", num);
                    suggestionCall.putExtra("client_name", name);


                    activity.startActivity(suggestionCall);

                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (suggestionList.suggestionName.equals("null") || suggestionList.suggestionName.equals("")) {
                suggestionNumber.setText(suggestionList.suggestionNumber);
            } else {
                suggestionNumber.setText(suggestionList.suggestionName);
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                suggestionDescription.setText(Html.fromHtml(suggestionList.suggestionDescription, Html.FROM_HTML_MODE_LEGACY));
            } else {
                suggestionDescription.setText(Html.fromHtml(suggestionList.suggestionDescription));
            }
        } catch (Exception e) {
            Log.i("exception", e.getMessage());
        }

        return convertView;
    }
 public static final String REQUEST_METHOD = "GET";

    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;

    @Override
    protected String doInBackground(String... params) {

        String clientUrl = params[0];

        String result;

        String inputLine;
        JSONObject obj;
        String data;
        String message;

        try {
            URL myUrl = new URL(clientUrl);
            HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection();

            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            connection.connect();

            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
            BufferedReader reader = new BufferedReader(streamReader);
            StringBuilder stringBuilder = new StringBuilder();

            while ((inputLine = reader.readLine()) != null) {
                stringBuilder.append(inputLine);

            }
            reader.close();
            streamReader.close();
            result = stringBuilder.toString();


        } catch (IOException e) {
            e.printStackTrace();
            result = null;
        }
        return result;
    }

public String[] getSuggestionsList() {

    String[] suggestionList = new String[5];
    String result;
    String status;
    JSONObject listObj;
    String suggestionsData;
    JSONObject suggestionsDataObj;
    JSONArray suggestionsDataArr;

    String ClientsSugestionsUrl = "https://example.com/token=" + authToken;

    getApiClientSugestions getSugestionsFromApi = new getApiClientSugestions();

    try {
        result = getSugestionsFromApi.execute(ClientsSugestionsUrl).get();

        try {
            listObj = new JSONObject(result);
            status = listObj.getString("result");
            suggestionsData = listObj.getString("suggestions");
            suggestionsDataArr = new JSONArray(suggestionsData);
        } catch (Exception e) {
            e.printStackTrace();
            suggestionsDataArr = null;
            status = null;
        }

        suggestionList[3] = status;
        suggestionList[4] = suggestionsDataArr.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return suggestionList;
}
异步任务类的一部分

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        SuggestionList suggestionList = getItem(position);
        int actualPosition = 0;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.sugestion_list, parent, false);
        }
        final Button suggestionsButton = (Button) convertView.findViewById(R.id.suggestionsMore);
        final TextView suggestionNumber = (TextView) convertView.findViewById(R.id.sugestionNumber);
        final TextView suggestionDescription = (TextView) convertView.findViewById(R.id.suggestionDescription);
        final ImageView bio = convertView.findViewById(R.id.sugestionBio);
        final ImageView block = convertView.findViewById(R.id.sugestionBlock);
        final ImageView call = convertView.findViewById(R.id.sugestionCall);
...
        final Animation slideUp = AnimationUtils.loadAnimation(getContext(), R.anim.slideup);
        final Animation slideDown = AnimationUtils.loadAnimation(getContext(), R.anim.slidedown);
        final Handler handler = new Handler();
        suggestionsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (bioSuggestions.getVisibility() == View.GONE) {
                    bio.setVisibility(View.VISIBLE);
                    block.setVisibility(View.VISIBLE);
                    call.setVisibility(View.VISIBLE);
                    bioSuggestions.startAnimation(slideUp);
                    blockSuggestions.startAnimation(slideUp);
                    callSuggestions.startAnimation(slideUp);
                } else if (bioSuggestions.getVisibility() == View.VISIBLE) {
                    bioSuggestions.startAnimation(slideDown);
                    blockSuggestions.startAnimation(slideDown);
                    callSuggestions.startAnimation(slideDown);
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            bio.setVisibility(View.GONE);
                            block.setVisibility(View.GONE);
                            call.setVisibility(View.GONE);
                        }
                    }, 300);
                }
            }
        });

        if (actualPosition != position) {
            if (bio.getVisibility() == View.VISIBLE) {
                bio.setVisibility(View.GONE);
                block.setVisibility(View.GONE);
                call.setVisibility(View.GONE);
            }

            actualPosition = position;

        }

        JSONObject jsonValSuggestions = new getSugestions().sugestionsDetails(position, "suggestions");

        try {
            final String name = jsonValSuggestions.getString("client_name");
            final String num = jsonValSuggestions.getString("client_number");
            final String description = jsonValSuggestions.getString("client_description");

            bio.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionsDetails = new Intent(view.getContext(), SuggestionsDetails.class);

                    suggestionsDetails.putExtra("client_number", num);
                    suggestionsDetails.putExtra("client_name", name);
                    suggestionsDetails.putExtra("client_description", description);
                    activity.startActivityForResult(suggestionsDetails, position);


                }
            });

            block.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionBlock = new Intent(view.getContext(), BlockSuggestionsActivity.class);

                    activity.startActivity(suggestionBlock);

                }

            });

            call.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent suggestionCall = new Intent(view.getContext(), CallSuggestionActivity.class);

                    suggestionCall.putExtra("client_number", num);
                    suggestionCall.putExtra("client_name", name);


                    activity.startActivity(suggestionCall);

                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (suggestionList.suggestionName.equals("null") || suggestionList.suggestionName.equals("")) {
                suggestionNumber.setText(suggestionList.suggestionNumber);
            } else {
                suggestionNumber.setText(suggestionList.suggestionName);
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                suggestionDescription.setText(Html.fromHtml(suggestionList.suggestionDescription, Html.FROM_HTML_MODE_LEGACY));
            } else {
                suggestionDescription.setText(Html.fromHtml(suggestionList.suggestionDescription));
            }
        } catch (Exception e) {
            Log.i("exception", e.getMessage());
        }

        return convertView;
    }
 public static final String REQUEST_METHOD = "GET";

    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;

    @Override
    protected String doInBackground(String... params) {

        String clientUrl = params[0];

        String result;

        String inputLine;
        JSONObject obj;
        String data;
        String message;

        try {
            URL myUrl = new URL(clientUrl);
            HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection();

            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            connection.connect();

            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
            BufferedReader reader = new BufferedReader(streamReader);
            StringBuilder stringBuilder = new StringBuilder();

            while ((inputLine = reader.readLine()) != null) {
                stringBuilder.append(inputLine);

            }
            reader.close();
            streamReader.close();
            result = stringBuilder.toString();


        } catch (IOException e) {
            e.printStackTrace();
            result = null;
        }
        return result;
    }

public String[] getSuggestionsList() {

    String[] suggestionList = new String[5];
    String result;
    String status;
    JSONObject listObj;
    String suggestionsData;
    JSONObject suggestionsDataObj;
    JSONArray suggestionsDataArr;

    String ClientsSugestionsUrl = "https://example.com/token=" + authToken;

    getApiClientSugestions getSugestionsFromApi = new getApiClientSugestions();

    try {
        result = getSugestionsFromApi.execute(ClientsSugestionsUrl).get();

        try {
            listObj = new JSONObject(result);
            status = listObj.getString("result");
            suggestionsData = listObj.getString("suggestions");
            suggestionsDataArr = new JSONArray(suggestionsData);
        } catch (Exception e) {
            e.printStackTrace();
            suggestionsDataArr = null;
            status = null;
        }

        suggestionList[3] = status;
        suggestionList[4] = suggestionsDataArr.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return suggestionList;
}
活动

public class CallsSuggestionsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calls_suggestions);
        Slidr.attach(this);
        getSupportActionBar().setTitle("Skontaktuj się");
    }

    @Override
    protected void onResume() {
        super.onResume();
        CallsSuggestionList();
    }

    public void CallsSuggestionList() {

        final ListView suggestionList = findViewById(R.id.sugestionList);

        final ArrayList<SuggestionList> suggestionArray = new ArrayList<SuggestionList>();
        SuggestionListAdapter suggestionListAdapter = new SuggestionListAdapter(getContext(), suggestionArray, this);
        String[] suggestionListArray = new getSugestions().getSuggestionsList();

        String suggStat = suggestionListArray[3];
        String arrayList = suggestionListArray[4];

        String clientName;
        String clientNumber;
        String clientDescription;

        try {
            JSONArray jsonArray = new JSONArray(arrayList);

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject explrObject = jsonArray.getJSONObject(i);
                clientName = explrObject.getString("client_name");
                clientNumber = explrObject.getString("client_number");
                clientDescription = explrObject.getString("client_description");

                if (suggStat.equals("true")) {

                    SuggestionList suggestionList1 = new SuggestionList(clientName, clientDescription, clientNumber);

                    suggestionListAdapter.addAll(suggestionList1);
                    suggestionListAdapter.notifyDataSetChanged();
                    suggestionList.setAdapter(suggestionListAdapter);

                }
            }
        } catch (Exception e) {
            Log.i("exception", e.getMessage());
            e.printStackTrace();
            clientName = null;
            clientDescription = null;
            clientNumber = null;
        }


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

适配器
是自定义的,向用户显示自定义视图。我使用类似的自定义适配器来显示手机上sqlite的内容,而那个应用程序并没有那个么慢。但当我打开这个活动时,它会显著减慢。我还注意到,当我按下后退按钮时,需要很长时间才能回到上一个屏幕

问题出在
getSuggestionList
函数中。在这个函数中,您将调用
getSuggestionsFromAPI.execute(clientsSuggestionsUrl.get()使您的代码再次同步。我的意思是你的代码正在等待这个代码被执行

一种方法(不是正确的方法,而是简单的方法):您可以调用new
getSuggestions().getSuggestionList()在新线程中

第二种方法是调用
getSugestionsFromApi.execute(ClientsSugestionsUrl)
而不调用
get()
函数。但要获得代码的结果,您需要提供一个接口。
要获得正确的用法:

从调用适配器类的位置发布类文件。@Naveen我将SuggestionListAdapter添加到最后一个列表“活动”中。我还更新了帖子并添加了标准的SuggestionList类。请粘贴整个类。@Naveen我更新了帖子谢谢!它起作用了!我使用了第二个选项和实现接口。