我正在尝试在已启动的服务中使用AWS Android SDK for S3。我对SDK和服务都不熟悉。我非常有信心Transfer Utility也在运行服务。
Handler (android.os.Handler) {11629d87} sending message to a Handler on a dead thread
java.lang.IllegalStateException: Handler (android.os.Handler) {11629d87} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)
at android.os.Handler.enqueueMessage(Handler.java:631)
at android.os.Handler.sendMessageAtTime(Handler.java:600)
at android.os.Handler.sendMessageDelayed(Handler.java:570)
at sksDoneLater(TransferService.java:189)
at com.amazonaws.mobileconnectors.s3.transferutility.TransferService.access$200(TransferService.java:44)
at com.amazonaws.mobileconnectors.s3.transferutility.TransferService$2.handleMessage(TransferService.java:166)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
以下是我用来启动它的代码:
AmazonS3 amazonS3 = new AmazonS3Client(credentialsProvider);
mTransferUtility = new TransferUtility(amazonS3, getApplicationContext());
TransferObserver observer = mTransferUtility.upload(
S3_RAW_BUCKET_ARN,
mVidFileKey,
mVidFile);
observer.setTransferListener(new TransferListener() {...})
之前它说它无法获得s3客户端。我在上面的应用程序类中创建了客户端,并成功地在一个活动中使用相同的代码来执行成功的传输,因此它必须是我不知道的服务的显而易见的东西。上述代码在从服务中的onStartCommand()
调用的方法中调用。
非常感谢任何帮助。
更新 - 请求全班并在此处显示:
public class VideoCompressionService extends Service {;
private Bus bus;
private TransferUtility mTransferUtility;
private int mVidWidth;
private int mVidHeight;
private File mCompressedVidFile;
private File mVidFile;
private String mVidFileKey;
private NotificationManager mNotificationManager;
private android.support.v4.app.NotificationCompat.Builder mNotification;
public VideoCompressionService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String realPath = MediaUtils.getRealVideoPathFromURI(this.getContentResolver(), intent.getData());
if (realPath != null) {
this.mVidFile = new File(realPath);
this.mVidFileKey = intent.getStringExtra(EXTRA_VID_FILE_KEY);
this.mVidWidth = intent.getIntExtra(EXTRA_VID_WIDTH, 0);
this.mVidHeight = intent.getIntExtra(EXTRA_VID_HEIGHT, 0);
this.bus = CoPhotoApplication.getVideoCompressionBus();
if (mVidFile != null && mVidFile.exists() && mVidFile.canRead()) {
mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotification = new NotificationCompat.Builder(this)
.setContentTitle("Compressing Video - Step 1 of 3")
.setContentText("Uploading video for processing...")
.setSmallIcon(R.drawable.ic_launcher);
if (mVidWidth == 0 || mVidHeight == 0) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mVidFile.getAbsolutePath());
mVidWidth = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
mVidHeight = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
mmr.release();
}
uploadVidToS3();
}
return Service.START_NOT_STICKY;
} else {
VideoCompressionService.this.stopSelf();
return Service.START_NOT_STICKY;
}
} else {
VideoCompressionService.this.stopSelf();
return Service.START_NOT_STICKY;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void uploadVidToS3() {
compressionUploadStarted();
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"*********ID HERE********", // Identity Pool ID
Regions.US_EAST_1 // Region
);
AmazonS3 amazonS3 = new AmazonS3Client(credentialsProvider);
mTransferUtility = new TransferUtility(amazonS3, getApplicationContext());
TransferObserver observer = mTransferUtility.upload(
S3_RAW_BUCKET_ARN,
mVidFileKey,
mVidFile);
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
if (state == TransferState.COMPLETED) {
compressionUploadFinished(true);
zencodeVideo(mVidFileKey);
} else if (state == TransferState.FAILED) {
compressionUploadFinished(false);
}
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
int progress = Math.round(100 * ((float) bytesCurrent / bytesTotal));
String progressPercentage = String.valueOf(progress) + "%";
compressionUploadProgress(progress, progressPercentage);
}
@Override
public void onError(int id, Exception ex) {
compressionUploadFinished(false);
}
});
}
private void compressionUploadStarted() {
bus.post(new CompressionUploadStartedEvent());
updateNotification();
}
private void compressionUploadProgress(int progress, String progressPercentage) {
bus.post(new CompressionUploadProgressEvent(progress, progressPercentage));
mNotification.setProgress(100, progress, false);
updateNotification();
}
private void compressionUploadFinished(boolean successfully) {
bus.post(new CompressionUploadFinishedEvent(successfully));
if (successfully) {
mNotification.setContentText("Upload complete");
} else {
mNotification.setContentTitle("Compression Failed");
mNotification.setContentText("Upload failed. Please try again later.");
}
updateNotification();
if (!successfully) {
VideoCompressionService.this.stopSelf();
}
}
private void updateNotification() {
mNotificationManager.notify(NOTIFICATION_ID, mNotification.build());
}
答案 0 :(得分:8)
我发现自己处于同一个问题...... 这就是为我解决的问题:
我注意到我在Manifest中注册的SyncAdapter有以下服务:
<service
android:name=".sync.SyncService"
android:exported="true"
android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
android:process =“:sync”告诉服务在名为:sync的私有进程中运行 所以我只是告诉Amazon SDK的TransferService在同一个线程中运行。
<service
android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
android:process=":sync"
android:enabled="true" />
之后,我不再收到错误 TransferService无法获取s3客户端,它将停止,最后能够将我的图片上传到S3
答案 1 :(得分:2)
您应该将客户端声明为全局变量,因为垃圾收集器可以删除它,如果您不这样做。