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
    }
}

次に、スレッド init でリスナーを定義します。

ProgressListener myListener = mySer;

ループで onProgressChange を呼び出します。

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