1

Я хочу создать уведомление для моего приложения для Android. Я отлично работаю, когда запускаю его с остальной частью моего кода внутри класса, все выполняется, когда я нажимаю кнопку, и уведомление работает нормально. Однако, поскольку необходимо выполнить много работы, приложение работает медленно, когда я нажимаю кнопку. Чтобы помочь этому, я отделил часть уведомления в свой класс, и я запускаю его в другом потоке. У меня нет большого опыта работы с потоками или уведомлениями в этом отношении, и я был бы признателен за помощь в решении этой проблемы. Должен ли я разделять часть уведомления на свой класс?Как создать Android-оповещение в другом потоке?

класс HomeActivity где нить вызывается для запуска, используя метод Start() при нажатии на кнопку:

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 
import android.widget.Toast; 
import java.util.ArrayList; 
import java.util.List; 
import Model.Data; 

public class HomeActivity extends FragmentActivity { 

private com.atmlocator.hooper.kenneth.atmlocator.Notification n; 

public void addListenerOnButton() { 

     locationSpinner = (Spinner) findViewById(R.id.spinner1); 
     options1Spinner = (Spinner) findViewById(R.id.spinner2); 
     options2Spinner = (Spinner) findViewById(R.id.spinner3); 
     Button locate = (Button) findViewById(R.id.locateBtn); 

     locate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      Context context = getApplicationContext(); 
      String text = "Loading..."; 

      //call notification thread here 
      n.start(); 

      //rest of code here... 
      } 
     } 
    } 
} 

, а затем класс оповещения:

import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v4.app.FragmentActivity; 

public class Notification extends FragmentActivity implements Runnable { 

    private Thread t; 
    private String name; 
    Context context; 

    Notification(String name, Context c) 
    { 
     this.name = name; 
     this.context = c; 
    } 

    public void run() 
    { 
     // Intent is triggered if the notification is selected 
     Intent intent = new Intent(context, HomeActivity.class); 
     PendingIntent pIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), intent, 0); 

     // Build notification 
     android.app.Notification not = new android.app.Notification.Builder(context) 
      .setContentTitle("Notification") 
      .setContentText("New email").setSmallIcon(R.drawable.atm) 
      .setContentIntent(pIntent).build(); 
     NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

     not.flags |= android.app.Notification.FLAG_AUTO_CANCEL; 

     notificationManager.notify(0, not); 
    } 

    public void start() 
    { 
     t = new Thread (this, name); 
     t.start(); 
    } 
} 

ответ

0

Должен ли я разделять часть уведомления на свой класс?

Не должно быть никаких проблем с этим!

Также вы должны показать свое уведомление вне темы. Вы можете использовать обработчик вместо того, чтобы показать уведомление вместо нити

так:

} 
.... 
// write this outside your code block 
Handler mHandler = new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
    super.handleMessage(msg); 
    showNotification(); 
} 
}; 
// call it like this instead of thread start 
mHandler.sendEmptyMessage(0); 

проверить эту ссылку для получения дополнительной информации: https://developer.android.com/training/multiple-threads/communicate-ui.html

+0

Это прекрасно работает за вашу помощь! – semiColon

+0

Всегда старайтесь найти решение через Android Api, которые предоставляются в самом SDK. Поверьте мне, есть много хороших вещей :) –

0

Это практически всегда работает:

public static void toast(final String text, final int length, final Context context) { 
    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(context, text, length).show(); 
     } 
    }); 
} 
+0

Это тост, а не уведомление ... –

+0

Он также работает для уведомлений – M66B

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