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

總是嘗試通過SDK本身提供的Android Api來找到解決方案。相信我有很多好東西:) –

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