java - Android 应用程序使用 onCreateOptionsMenu 变得越来越慢

标签 java android

我的应用程序在 ListView 中显示所有图像。它很快,但后来我添加了 onCreateOptionsMenu。从那时起,该应用程序非常慢并且只显示一张图像。这与线程有关吗?

这是我的 MainActivity 代码:

public class MainActivity extends AppCompatActivity {

  static ArrayList<Product> arrayList;
  ListView lv;

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

      arrayList = new ArrayList<>();
      lv = (ListView) findViewById(R.id.listView);

      runOnUiThread(new Runnable() {
         @Override
         public void run() {
            new ReadJSON().execute("http://10.0.3.2:5000/products/id/6");
          }
      });
  }

  class ReadJSON extends AsyncTask<String, Integer, String> {

      @Override
      protected String doInBackground(String... params) {
          return readURL(params[0]);
      }

      @Override
      protected void onPostExecute(String content) {
          try {
              JSONObject jsonObject = new JSONObject(content);
              JSONArray jsonArray =  jsonObject.getJSONArray("products");

              for(int i =0;i<jsonArray.length(); i++){
                  JSONObject productObject = jsonArray.getJSONObject(i);
                  arrayList.add(new Product(
                          productObject.getString("image"),
                          productObject.getString("title"),
                          productObject.getString("price"),
                          productObject.getString("description")
                  ));
              }
          } catch (JSONException e) {
              e.printStackTrace();
          }
          CustomListAdapter adapter = new CustomListAdapter(
                  getApplicationContext(), R.layout.custom_list_layout, arrayList
          );
          lv.setAdapter(adapter);

          lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {  // list item click opens a new detailed activity
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Product product = arrayList.get(position); // getting the model
                  Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                  intent.putExtra("title", product.getName());
                  intent.putExtra("price", product.getPrice());
                  intent.putExtra("img", product.getImage());
                  intent.putExtra("description", product.getDescription());
                  intent.putExtra(ShoppingCartHelper.PRODUCT_INDEX, position);
                  startActivity(intent);
              }
          });
      }
  }

  private static String readURL(String theUrl) {
      StringBuilder content = new StringBuilder();
      try {
          // create a url object
          URL url = new URL(theUrl);
          // create a urlconnection object
          URLConnection urlConnection = url.openConnection();
          // wrap the urlconnection in a bufferedreader
          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
          String line;
          // read from the urlconnection via the bufferedreader
          while ((line = bufferedReader.readLine()) != null) {
              content.append(line + "\n");
          }
          bufferedReader.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
      return content.toString();
  }

  public static ArrayList<Product> getProduct(Resources res) {
      return arrayList;
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {

      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);

      return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();
      if(id == R.id.shoppingcart) {
          Intent viewShoppingCartIntent = new Intent(getBaseContext(), ShoppingCartActivity.class);
          startActivity(viewShoppingCartIntent);
          return true;
      }

      return super.onOptionsItemSelected(item);
  }

}

编辑 1: 菜单资源文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:id="@+id/shoppingcart"
    android:icon="@drawable/shop_1600"
    android:title="Item"
    app:showAsAction="always" />
</menu>

编辑 2:这是发生问题的最小示例。

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == R.id.shoppingcart) {
        Intent viewShoppingCartIntent = new Intent(getBaseContext(), ShoppingCartActivity.class);
        startActivity(viewShoppingCartIntent);
        return true;
    }

    return super.onOptionsItemSelected(item);
  }
}

最佳答案

您在 onCreateOptionsMenu 中没有做任何繁重的工作,所以我看不出有什么问题。

但是在 runOnUiThread 中运行你的 AsyncTask 并不是一个好主意。 AsyncTask 本身已经处理了哪些代码在单独的线程上运行,哪些代码在 UI 线程上运行。

onCreate 中调用它,就像这样:

new ReadJSON().execute("http://10.0.3.2:5000/products/all");

关于java - Android 应用程序使用 onCreateOptionsMenu 变得越来越慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44843056/

相关文章:

java - unicode 支持使用数据源名称与 sqlserver 进行 jdbc 连接

java - "AWT-EventQueue-0"类转换异常 : JPanel cannot be cast MyJTestPanel

java - 使用安全标志在后台自定义 android 应用预览

java - LVL 在 Jelly Bean 上崩溃

java - 安卓。没有找到启动器 Activity ?

java - 仅当工作线程在 Android 中完成时才在主线程中调用函数

java - 在调用 wait 和 notification 之后,我尝试从主线程加入两个线程

java - 尝试将异常输出到文件 - 如何将对象传递到 catch block ?

android - 如何从 Android 文件管理器中获取附加文档的文件路径

android - 在 PreferenceCategory 中添加子类别