1

私はJavaの初心者で、バックアップとしてアップロードするアプリの最初のスレッドをコーディングしています。例からこのコードを取得し、いくつかの変更を加えました。

ブール値が存在するかどうか(ファイルが存在する場合)を確認する必要があります。存在しない場合は、スレッドを中断し、アクティビティをエラー表示に変更します。試してみましたが、機能しませんでした。例外がスローされ、アプリがクラッシュしました。どうすれば解決できますか?

ありがとうございます。

Thread threadMenu =  new Thread(new Runnable() {
public void run() {
    runOnUiThread(new Runnable () {
        public void run() {
            /*
            messageText.setText("uploading started.....");
            ProgressDialog progress = new ProgressDialog(null, serverResponseCode);
            progress.setTitle("Loading");
            progress.setMessage("Wait while loading...");
            progress.show();
            */
        }
    });


    File folder = new File(Environment.getExternalStorageDirectory().toString() + myfolder);

    File dir = new File(folder.toString());
    boolean exists = dir.exists();


    uploadFile(folder + "/My_File.png");

    //IF NOT FILES REDIRECT TO NO FILES ACTIVITY



    if (!exists) {

        try {
            //Log.v("ARCHIVOS NO ENCONTRADOS", folder.toString());
            Intent i=new Intent(UploadToServer.this, NoFiles.class);
            startActivity(i);


            } catch (InterruptedException e) {
            // We've been interrupted: no more messages.
            return;
        }


        // Thread.currentThread().interrupt();
        Log.v("ARCHIVOS NO ENCONTRADOS", folder.toString());
        Intent i=new Intent(UploadToServer.this, NoFiles.class);
        startActivity(i);
        Thread.currentThread().interrupt();
    }

    Thread.currentThread().interrupt();
}

});
threadMenu.start();

} 

これは Logcat の出力です -> スレッドが停止したとき、私は Sd カードを撤去しました。

10-20 23:50:44.158: W/dalvikvm(16441): threadid=1: thread exiting with uncaught exception (group=0x40018578)
10-20 23:50:44.166: E/AndroidRuntime(16441): FATAL EXCEPTION: main
10-20 23:50:44.166: E/AndroidRuntime(16441): java.lang.NullPointerException
10-20 23:50:44.166: E/AndroidRuntime(16441):    at com.uploadtoserver.UploadToServer.uploadFile(UploadToServer.java:149)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at com.uploadtoserver.UploadToServer$1$1.run(UploadToServer.java:105)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at android.os.Handler.handleCallback(Handler.java:587)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at android.os.Looper.loop(Looper.java:130)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at android.app.ActivityThread.main(ActivityThread.java:3687)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at java.lang.reflect.Method.invokeNative(Native Method)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at java.lang.reflect.Method.invoke(Method.java:507)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
10-20 23:50:44.166: E/AndroidRuntime(16441):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

1

ここで理解しておくべき主なことは、奇妙な競合状態を引き起こす可能性があるため、バックグラウンド スレッドから startActivity() メソッドを呼び出すことはできないということです。代わりに、ランナブルをメイン スレッドのメッセージ キューにポストして、メイン スレッドで実行する必要があります。

このように onCreate メソッドを更新します

   Thread threadMenu;
    Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler();
        threadMenu = new Thread(runnable);
        threadMenu.start();

    }

onCreateが終了したら、このコードを書きます

Runnable runnable = new Runnable() {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                public void run() {

                    // messageText.setText("uploading started.....");
                    // ProgressDialog progress = new ProgressDialog(null,
                    // serverResponseCode);
                    // progress.setTitle("Loading");
                    // progress.setMessage("Wait while loading...");
                    // progress.show();

                }
            });

            File folder = new File(Environment.getExternalStorageDirectory()
                    .toString() + "myfolder");

            File dir = new File(folder.toString());
            boolean exists = dir.exists();
            System.out.println("boolean value is " + exists);

            // uploadFile(folder + "/My_File.png");

            // IF NOT FILES REDIRECT TO NO FILES ACTIVITY

            if (!exists) {

                // Thread.currentThread().interrupt();
                Log.v("ARCHIVOS NO ENCONTRADOS", folder.toString());




                handler.post(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        Intent i = new Intent(UploadToServer.this, NoFiles.class);
                        startActivity(i);

                        threadMenu.stop();
                    }
                });

            }


        }
    };

Androidのスレッドに加えて、Androidが推奨するAsyncTaskを使用することをお勧めします。スレッドと Asynctask の詳細については、こちらを参照してください。

于 2013-10-21T06:12:11.033 に答える