2015-06-03 3 views
1

Я работаю над приложением запуска, где я создал рабочий стол, и на моем рабочем столе есть кнопка приложения. Когда я нажимаю кнопку ящика приложения, для открытия активности моих приложений требуется очень много времени! Я не знаю, почему это происходит, я пытался использовать высокопроизводительные устройства, такие как Nexus 5, но никаких изменений. Любые решения? Вот мой код:Почему моя кнопка очень медленно реагирует на Android?

От Homescreen Служб активность Код:

drawer.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       Intent myIntent = new Intent(MainActivity.this, Apps.class); 
       startActivity(myIntent); 
       overridePendingTransition(R.anim.left, R.anim.rtl); 
      } 
     }); 

AppsActivity.java:

public class Apps extends Activity { 

    SharedPreferences colors_app, color_label; 
    GridView mGrid; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.apps); 

     loadApps(); 

     mGrid = (GridView) findViewById(R.id.app_grid); 

     AppsAdapter adapter = new AppsAdapter(this); 
     mGrid.setAdapter(adapter); 

     colors_app = getSharedPreferences("MyColor", 1); 

     int colorcode2 = colors_app.getInt("color_code", 0); 
     if (colorcode2 != 0) { 

      Apps.this.findViewById(R.id.apps_back).setBackgroundColor(
        colorcode2); 

     } 

     mGrid.setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, 
        View convertView, int position, long id) { 
       // TODO Auto-generated method stub 
       ResolveInfo cleckedResolveInfo2 = (ResolveInfo) parent 
         .getItemAtPosition(position); 
       ActivityInfo clickedActivityInfo2 = cleckedResolveInfo2.activityInfo; 

       Uri packageURI = Uri.parse("package:" 
         + clickedActivityInfo2.applicationInfo.packageName); 
       Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, 
         packageURI); 
       startActivity(uninstallIntent); 

       return true; 
      } 

     }); 

     mGrid.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View convertView, 
        int position, long id) { 
       ResolveInfo cleckedResolveInfo = (ResolveInfo) parent 
         .getItemAtPosition(position); 
       ActivityInfo clickedActivityInfo = cleckedResolveInfo.activityInfo; 

       Intent intent = new Intent(Intent.ACTION_MAIN); 
       intent.addCategory(Intent.CATEGORY_LAUNCHER); 
       intent.setClassName(
         clickedActivityInfo.applicationInfo.packageName, 
         clickedActivityInfo.name); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
         | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
       startActivity(intent); 
      } 

     }); 
    } 

    private List<ResolveInfo> mApps; 

    private void loadApps() { 
     Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
     mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

     mApps = getPackageManager().queryIntentActivities(mainIntent, 0); 

    } 

    public class AppsAdapter extends BaseAdapter { 

     private Context context; 
     private LayoutInflater layoutInflater; 

     public AppsAdapter(Context c) { 
      context = c; 
      layoutInflater = LayoutInflater.from(context); 

     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      View grid; 

      if (convertView == null) { 

       grid = new View(context); 
       grid = layoutInflater.inflate(R.layout.grid_custom, null); 

      } else { 
       grid = (View) convertView; 
      } 

      ResolveInfo info = mApps.get(position); 

      ImageView icon = (ImageView) grid.findViewById(R.id.icon); 
      icon.setImageDrawable(info.activityInfo 
        .loadIcon(getPackageManager())); 

      TextView label = (TextView) grid.findViewById(R.id.label); 
      Typeface tf_label = Typeface.createFromAsset(getAssets(), 
        "fonts/RobotoC-Regular.ttf"); 
      label.setTypeface(tf_label); 
      label.setText(info.activityInfo.loadLabel(getPackageManager()) 
        .toString()); 

      color_label = getSharedPreferences("LabelColor", 1); 

      int color_lab = color_label.getInt("color_code_label", 0); 
      if (color_lab != 0) { 
       label.setTextColor(color_lab); 

      } 

      return grid; 
     } 

     public final int getCount() { 
      return mApps.size(); 
     } 

     public final Object getItem(int position) { 
      return mApps.get(position); 
     } 

     public final long getItemId(int position) { 
      return position; 
     } 
    } 
} 

Nobodys получил ответ?

+0

Можете ли вы опубликовать stacktrace, когда нажимаете кнопку – 3xplore

+0

Чувак, где я найду это в Eclipse? –

+0

Правильный способ - загрузить приложение в первый раз, сохранить его в кеше, а в следующий раз загрузить приложения в кеш и загрузить новые приложения с помощью asyntask или UIThread. – Santiago

ответ

0

Профилирование исполнения вашего кода позволит вам увидеть, где находится узкое место.

Я хотел бы предложить, это будет в функции getView():

(1) Вызов функции для loadLabel известен потенциально может быть медленным.

PackageInfo LoadLabel slow performance

(2) Вызов Typeface.createFromAsset для каждого элемента в адаптере не является хорошей идеей.

+1

Ой, но для удобства настройки пусковой установки мне нужны пользовательские шрифты :( –

+0

Это нормально, но вы можете просто загрузить его один раз и сохранить ссылку на шрифт, а не загружать его каждый раз, когда getView называется – BrentM

+0

Есть ли альтернатива функция, которая может заменить «loadLabel»? –

Смежные вопросы