0

今、私は AsyncTask.for を使用して画像を保存したいという点で Android 写真撮影アプリケーションを開発しています。最初に onPreExecute() を使用してその iam の進行状況ダイアログを表示し、オーバーレイ画像は doInBackground() で実行され、最後に保存したいonPostExecute() で save() を呼び出す画像を書き込みますが、保存ボタンをクリックすると強制終了エラーが発生します...

    This is my logcat file
    11-17 12:33:56.689: E/AndroidRuntime(8753): FATAL EXCEPTION: AsyncTask #1
    11-17 12:33:56.689: E/AndroidRuntime(8753): java.lang.RuntimeException: An error occured while executing doInBackground()
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.lang.Thread.run(Thread.java:1019)
    11-17 12:33:56.689: E/AndroidRuntime(8753): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.ViewRoot.checkThread(ViewRoot.java:3035)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.ViewRoot.requestLayout(ViewRoot.java:636)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.ImageView.setImageDrawable(ImageView.java:322)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.ImageView.setImageBitmap(ImageView.java:336)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share.apllyEffect(share.java:145)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share.access$0(share.java:122)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share$AsyncClass.doInBackground(share.java:106)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share$AsyncClass.doInBackground(share.java:1)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     ... 4 more
    11-17 12:33:56.689: E/AndroidRuntime(8753): [Blue Error Handler] Make Debugging Report file for AsyncTask #1
    11-17 12:33:56.689: E/AndroidRuntime(8753): java.lang.RuntimeException: An error occured while executing doInBackground()
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.lang.Thread.run(Thread.java:1019)
    11-17 12:33:56.689: E/AndroidRuntime(8753): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.ViewRoot.checkThread(ViewRoot.java:3035)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.ViewRoot.requestLayout(ViewRoot.java:636)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.view.View.requestLayout(View.java:8267)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.ImageView.setImageDrawable(ImageView.java:322)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.widget.ImageView.setImageBitmap(ImageView.java:336)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share.apllyEffect(share.java:145)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share.access$0(share.java:122)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share$AsyncClass.doInBackground(share.java:106)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at com.outthinking.instatext.share$AsyncClass.doInBackground(share.java:1)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    11-17 12:33:56.689: E/AndroidRuntime(8753):     ... 4 more
    11-17 12:33:57.279: E/WindowManager(8753): [WindowManagerImpl.java:290:closeAll()] Activity com.outthinking.instatext.share has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40543970 that was originally added here
    11-17 12:33:57.279: E/WindowManager(8753): android.view.WindowLeaked: Activity com.outthinking.instatext.share has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40543970 that was originally added here
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.ViewRoot.<init>(ViewRoot.java:265)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.app.Dialog.show(Dialog.java:241)
    11-17 12:33:57.279: E/WindowManager(8753):  at com.outthinking.instatext.share$AsyncClass.onPreExecute(share.java:96)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.os.AsyncTask.execute(AsyncTask.java:391)
    11-17 12:33:57.279: E/WindowManager(8753):  at com.outthinking.instatext.share.onClick(share.java:182)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.View.performClick(View.java:2485)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.view.View$PerformClick.run(View.java:9080)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.os.Handler.handleCallback(Handler.java:587)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.os.Handler.dispatchMessage(Handler.java:92)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.os.Looper.loop(Looper.java:130)
    11-17 12:33:57.279: E/WindowManager(8753):  at android.app.ActivityThread.main(ActivityThread.java:3737)
    11-17 12:33:57.279: E/WindowManager(8753):  at java.lang.reflect.Method.invokeNative(Native Method)
    11-17 12:33:57.279: E/WindowManager(8753):  at java.lang.reflect.Method.invoke(Method.java:507)
    11-17 12:33:57.279: E/WindowManager(8753):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894)
    11-17 12:33:57.279: E/WindowManager(8753):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
    11-17 12:33:57.279: E/WindowManager(8753):  at dalvik.system.NativeStart.main(Native Method)

これは私のコードです:

    public class AsyncClass extends AsyncTask<Void, String, Bitmap> { 
                    private Context context; 
                    ProgressDialog dialog; 

                        public AsyncClass(Context cxt) { 
                            context = cxt; 
                            dialog = new ProgressDialog(context); 
                        } 

                        @Override 
                        protected void onPreExecute() { 
                            dialog.setTitle("Please wait save the image..."); 
                            dialog.show(); 
                        } 

                        @Override 


                        protected Bitmap doInBackground(Void... unused) { 


                            //Bitmap original = getResizedBitmap(ImageViewShow.bitmap_img, sharewidth,shareheight);
                            Bitmap bmp1 = apllyEffect();
                            //if()
                            return bmp1; 
                        } 





                        @Override 
                        protected void onPostExecute(Bitmap bmp) { 
                            String fieName = UUID.randomUUID().toString();   
                            SaveImage(fieName, 100,bmp);
                            dialog.dismiss(); 
                        } 
                    } 
    and save code is...
    private Bitmap apllyEffect() {
                    if(second.frame_bitmap==null)
                    {
                      second.theam_bitmap = BitmapFactory.decodeResource(getResources(), second.current_theam);

                     second.bmOverlay = Bitmap.createBitmap(second.canvas.getWidth(), second.canvas.getHeight(), second.theam_bitmap.getConfig());
                       second.canvas = new Canvas(second.bmOverlay);

                       second.canvas.setBitmap(second.bmOverlay);
                       second.canvas.drawBitmap(second.theam_bitmap, new Matrix(), null);
                       Typeface typeface=stylesapply(second.typefacevalue);
                       share_tv.setTypeface(typeface);
                       share_tv.setTextColor(second.current_color);
                       share_img.setImageBitmap(second.bmOverlay);  
                    }else{
                   second.theam_bitmap= BitmapFactory.decodeResource(getResources(), second.current_theam);
                   second.frame_bitmap = BitmapFactory.decodeResource(getResources(), second.current_frame);
                   second.bmOverlay = Bitmap.createBitmap(second.canvas.getWidth(), second.canvas.getHeight(), second.theam_bitmap.getConfig());
                   second.canvas = new Canvas(second.bmOverlay);
                   second.canvas.setBitmap(second.bmOverlay);
                   second.canvas.drawBitmap(second.theam_bitmap, new Matrix(), null);
                   second.canvas.drawBitmap(second.frame_bitmap, new Matrix(), null);
                   share_tv.setTextColor(second.current_color);
                   share_img.setImageBitmap(second.bmOverlay);
                    }
                    return second.bmOverlay;
                }
4

4 に答える 4

1

ASyncTask から UI 操作を実行しようとしているようです。onPreExecuteonPostExecuteおよびからのみ UI 操作を行う必要がありonProgressUpdateます。doInBackground では、UI 要素に直接アクセスしないでください。

145行目に何かを呼び出している106行目のshare.javaのコードを確認してください...

あなたがするとき

share_img.setImageBitmap(...)

これは間違いなく UI 操作です...別の場所に移動する必要があります。また、すべての操作share_tv

を使用するかonProgressUpdate、 の最後にのみある場合は、 にdoInBackground移動できますonPostExecute。それ以外の場合は、runOnUiThreadを使用することもできます

于 2012-11-20T05:33:41.193 に答える
1

メイン スレッドからのみ、UI で操作を呼び出すことができます。doInBackground()独自のスレッドを使用します。onProgressUpdate()AsyncTask の進捗オーバーライド メソッドを処理します。

于 2012-11-20T05:34:19.070 に答える
0

- doInBackground()メソッドは非 UI スレッドで非 UI 作業onPost()を実行するために使用され、メソッドは専用 UI スレッドで UI 作業を実行するために使用されます。

-メソッドでUI 作業を実行しようとしていると思いますがdoInBackground()、それが原因で失敗しています。

于 2012-11-20T05:33:29.747 に答える
0

バックグラウンド スレッドで UI 操作を行うことはできません。これを行うと、 が得られますandroid.view.ViewRoot$CalledFromWrongThreadException

UI 操作をonPostExecute()メソッドに移動します。

于 2012-11-20T05:34:50.800 に答える