线程仅在第二次运行时工作

时间:2014-02-06 15:10:35

标签: java android multithreading

我在Android App中有一个Singleton(工作得很好)我需要在另一个线程的类变量中设置数据的一个函数,但是如果我运行该函数两次,数据只会设置。

的onCreate:

Thread thread;
Runnable runnables;
String recvData;

@Override
public void onCreate() {
    super.onCreate();  
    singleInstance = this;
    recvData = "one";
    Log.v("oncreate", "singleton");
}

threaded_data_set:

public String threaded_set_data() {
    runnables = new Runnable(){
        @Override
        public void run() {
            recvData = "two";
            return;
        }
    };
    thread = new Thread(runnables);
    thread.start()
    Log.v("Data", recvData);
    return recvData;
}

首次运行时记录("Data", "one"),仅在第二次记录时更改为("Data", "two")

我在这里做错了什么?

5 个答案:

答案 0 :(得分:2)

recvData的默认值为:

recvData = "one";

这里没有错,

Log.v("Data", recvData);

在您的主题打印出第二条日志消息之前打印出来。

答案 1 :(得分:1)

您假设线程在您到达日志记录语句后立即完成。

尝试在设置时记录线程中的值,您将看到代码在第一次记录调用后发生

它正常工作,但你希望线程在你的方法继续运行之前完成:)

答案 2 :(得分:0)

这里没有太大问题,您只是没有使用recvData

的新分配值
public String threaded_set_data()
{
    runnables = new Runnable(){

        @Override
        public void run() {
                        recvData = "two";
                        Log.v("Data", recvData);
                        //return; <-- not really needed
                    }
    };
    thread = new Thread(runnables);
    thread.start()
    Log.v("Data", recvData);
    return recvData;
}

答案 3 :(得分:0)

在线程的第一次运行时,后者在它自己的线程中运行,这意味着你已经在runnable完成运行之前返回了rec​​vData,因为它并行运行。你想要做的是改用AsyncTask。

答案 4 :(得分:0)

您似乎错过了线程如何工作的细微差别。我认为你假设你的线程在你的日志语句之前运行并返回,但你无法安全地假设。

相反,请尝试使用像您的问题中的评论一样的处理程序。 handler的设计完全适用于此类事物。 Vogella(一个很棒的资源顺便说一句)在e xplaining it so I will direct you there.

方面做得更好