Java中的线程管理

Java中的线程管理,java,android,multithreading,Java,Android,Multithreading,我在android应用程序中创建了2个线程,但它们不工作: final Thread t1 = new Thread() { // @Override public void run() { camera.takePicture(null, null, photoCallback); Log.e("mediafile", mediaFile+"");

我在android应用程序中创建了2个线程,但它们不工作:

final Thread t1 = new Thread() {
                // @Override
                public void run() {
                    camera.takePicture(null, null, photoCallback);
                    Log.e("mediafile", mediaFile+"");
                }
            };
            t1.start();

            final Thread t2 = new Thread() {
                // @Override
                public void run() {
                    Intent myIntent = new Intent(CameraActivity.this, ModificationActivity.class);
                    Log.e("le chemin de la photo", "" + mediaFile);
                    myIntent.putExtra("imagePath", ""+mediaFile);
                    startActivity(myIntent);
                }
            };
            try {
                t1.join();
                t2.start();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
当我开始我的意图时,我的变量总是为null,因为第一个线程没有完成

我希望你能帮助我

提前感谢大家

这是日志:

11-05 14:29:59.936 18216-18216/com.mcm.citadium I/编舞﹕ 跳过72帧!应用程序可能在其主线程上做了太多工作。11-05 14:30:05.140 18216-18387/com.mcm.citadium E/mediafile﹕ 空11-05 14:30:05.148 18216-18389/com.mcm.citadium E/le chemin de la photo﹕ 空11-05 14:30:05.652 18216-18216/com.mcm.citadium E/fin de photoCallback﹕ /存储/sdcard0/Pictures/MyCameraApp/IMG_20131105_143005.jpg


我认为您可以使用[处理程序]: 安排两个线程

一些例子:

或者[AsyncTask]:几乎等于处理程序+线程+消息+线程池

一些例子:


为什么t2的开始在try-catch中?我认为,如果您简单地将两个开始都放在try-catch之外,然后将两个线程都加入其中,那么这应该是可行的

t1.start();
t2.start();

try {
    t1.join();
    t2.join();
}
catch (Exception e) { e.printStackTrace(); }

首先,您不需要创建任何线程来捕获图像-您可以在主线程上安全地运行camera.takePicture-它将在另一个线程中处理其工作,请参见

例如,您可以在button onClick处理程序中触发拍照活动:

        shootButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mCamera.takePicture(null, null, photoCallback);
            }
        });
然后,您的photoCallback将看起来像:

    Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            // generate file path for new picture
            String fileName = "myPicture.jpg";
            String mediafile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
               .getCanonicalPath() + "/mydir/" + fileName;

            // launching new activity to modify picture
            Intent myIntent = new Intent(CameraActivity.this,
                ModificationActivity.class);
            Log.e("le chemin de la photo", "" + mediaFile);
            myIntent.putExtra("imagePath", ""+mediaFile);
            startActivity(myIntent);
        }
    };

哪个变量是空的?看起来第一个线程并没有设置任何变量。Java中的并发性并不简单。如果你有这样的问题,我强烈建议你在尝试使用多线程制作一个真正的应用程序之前,阅读所有关于这个主题的文章。这是一个很好的起点->t1.join阻塞直到线程t1终止,您的问题不是线程问题。发布实际堆栈跟踪。我怀疑您在日志语句中得到了t1内部的异常,并且该问题与线程无关。实际上,我甚至不知道您为什么在这种情况下使用线程?好的,所以我想我会在容易的时候努力搜索:。无论如何,非常感谢你的帮助!