Код в порядке (?), Но приложение работает медленно на Android (служба + намерения) - PullRequest
0 голосов
/ 30 декабря 2011

Итак, у меня есть 3 java-файла:

  1. ServiceActivity - основная деятельность, с которой все начинается (static int i определено ранее в этом файле)

  2. Elserwis - это служба (в ней есть таймер, в котором я передал переменную i -> это будет час с момента, когда таймер должен включиться)

  3. Sekundo - намерение, в которое пользователь помещает переменную hour =>> i <</p>

Вот фрагмент кода из основной деятельности -> ServiceActivity:

private OnClickListener startListener = new OnClickListener() {
    public void onClick(View v){
        Intent intent = new Intent(getApplicationContext(), Sekundo.class);
        startActivityForResult(intent,1337);
    }         
};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data ) {
    /* Place out code to react on Activity-Result here. */
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1337){
        i=data.getIntExtra("result",5);
        Toast tost = Toast.makeText(getApplicationContext(), "ELO"+data.getIntExtra("result",0)+data.getIntExtra("result1",0), 1000);
        tost.show();
        startService(new Intent(SerwisActivity.this,Elserwis.class));  
    }
}

Iдумаю, что проблема в конце, где лежит startService (как подфункция onActivityResult)

Если вам нужен любой другой фрагмент кода, я могу вставить его здесь, но вопрос в том, что мое приложение работает очень медленноначало, когда запускается таймер, и Toast отображается более 1 минуты.Кто-нибудь знает почему?

РЕДАКТИРОВАТЬ:

     public class Elserwis extends Service {

 @Override
 public IBinder onBind(Intent arg0) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void onCreate() {
  super.onCreate();

  okresowePowiadomienie();

 Toast.makeText(getApplicationContext(),"Service LAUNCHED!", 1000).show();


 }


 Date data33 = new Date(111,11,SerwisActivity.i,2,25);
 int d = data33.getDate();
 Timer timer = new Timer();
 public void okresowePowiadomienie(){


TimerTask timerTask = new TimerTask(){

  public void run() {



    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_launcher,"OKRes",System.currentTimeMillis());

    Intent notIntent = new Intent(getApplicationContext(), SerwisActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notIntent, 0);

    notification.setLatestEventInfo(getApplicationContext(),"Powiadomienie x:","Kliknij aby d:usunac ;)t:"+d,contentIntent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notificationManager.notify(1335, notification);
  // }  };
  }};
    timer.scheduleAtFixedRate(timerTask ,data33 , 120000); }


@Override
 public void onDestroy() {

  super.onDestroy();
  timer.cancel();
  Toast.makeText(this, "Service dead!", Toast.LENGTH_LONG).show();
 }
}

это просто альфа-версия моего кода, но final будет аналогичным (теперь он только передает информацию о дне на мой сервис -> в окончательной версиидолжно пройти час и минута)

"Служба запущена!"тост остается целую вечность, он падает в большинстве случаев на AVD, на моем реальном смартфоне это просто занимает много времени, но все равно он должен работать плавно ...


В основном проблема началась, когда я переместил startService изФункция onClick () ДО элемента onActivityResult.Он должен оставаться там, потому что сервис использует int i (пользователь вводит типы int i в новом намерении), чтобы установить данные для моего таймера (таймер находится в Elserwis).Я обновил свой первый пост с сервисным кодом, чтобы вы могли понять, что я имею в виду

1 Ответ

1 голос
/ 30 декабря 2011

Я УДОБСТВУЮ, что само по себе startService не вызывает каких-либо блокировок.
Я УДОБСТВУЮ, что у вас есть код в startService, выполнение которого занимает некоторое время и вызывает блокировку пользовательского интерфейса приложения.

Если это так, то вам нужно создать новый поток внутри службы, прежде чем запускать код, вызывающий задержку.

Вам необходимо сохранить все долго работающие блоки кода.в отдельном потоке, чтобы не блокировать пользовательский интерфейс.Я был бы заинтересован в коде, который находится в Elserwis.class, потому что это помогло бы определить, где проблема на самом деле лежит.Или, если вы посмотрите на свой код и выясните его на основе того, что я сказал, вам не нужно больше публиковать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...