1

我有一项服务,用于使用 Http 将一些文件上传到服务器。我想在上传文件时显示进度指示器。最初,我使用 startForeground() 方法在传输过程中显示一个简单的通知。我现在想使用一个进度指示器,就像从 Google Play 商店下载应用程序时显示的那样。我按照http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView上所示的示例截断

但是在我的服务中实现它会导致 RuntimeException。我的 Service 类中的代码如下:

public int onStartCommand(Intent intent, int flags, int startId) {
    Thread myThr = new Thread(new MyThreadClass());

    myThr.start();

    return START_STICKY;

}

public class SendSelectedNew extends Thread{

    public void run(){
        try{
            if(fileSize()>0){
                int fileSize = getSize();
                for(int i = 0; i<fileSize;i++){
                    setNote(sizeOfTheList, i);
                    startForeground(1339, note);
                    mNotifyManager.notify(1339, note);
     /*Code to upload files to my Server

     */             
            }
                MyService mySer = MyService.this;

                mySer.stopForeground(true);
                mySer.stopSelf();

            }               
        }catch(Exception e){
            if(connection!=null){
                connection.disconnect();                    
            }
            e.printStackTrace();
        }
    }   
 }

public void setNote(int fileSize, int progress){
    note = new Notification.Builder(this).setContentText("Sending files").setSmallIcon(R.drawable.sendreceive).setContentTitle("MYApp").setProgress(fileSize, progress, false).build();
    note.flags|= Notification.FLAG_NO_CLEAR;
}

我究竟做错了什么?我是否不允许显示服务的进度指示器?我没有在 Logcat 中为我的应用程序获取任何日志,但这就是我在“调试”窗格中得到的

Thread [<1> main] (Suspended (exception RuntimeException))  
ActivityThread.handleServiceArgs(ActivityThread$ServiceArgsData) line: 2782 
ActivityThread.access$2000(ActivityThread, ActivityThread$ServiceArgsData) line: 152    
ActivityThread$H.handleMessage(Message) line: 1385  
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 137 
ActivityThread.main(String[]) line: 5328    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 511  
ZygoteInit$MethodAndArgsCaller.run() line: 1102 
ZygoteInit.main(String[]) line: 869 
NativeStart.main(String[]) line: not available [native method]  
4

1 回答 1

0

不要从线程调用你的 setNote 方法,而是在你的服务中实现一个监听器:

public interface ProgressListener{
    public abstract void onProgressChange(int progress);
}

public class MyService implements ProgressListener{
    @Override
    public void onProgressChange(int progress){
        //update your UI, launch notification or whatever you want
    }
}

然后在你的线程初始化中定义你的监听器:

ProgressListener myListener = mySer;

并在循环中调用 onProgressChange:

myListener.onProgressChange(i);
于 2013-08-08T13:22:40.557 回答