从不同的线程获取变量android java

时间:2015-11-30 15:13:47

标签: android multithreading android-studio runnable

我收到错误:android.os.networkonmainthreadexception。我发现,这是因为我必须将互联网请求放在除主要之外的线程上。我已经找到了将它放在一个单独的线程上的方法,并使用了这个,因为我可以很好地理解它:

public void use() throws Exception
{
    int a;
    Thread thread = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            try
            {
                //do something
        a=32;
        //do smthn else
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });

    thread.start();
int b= a;
}

我创建一个新线程并将网络层放入其中。问题是,我无法从变量中获取变量。当我喜欢int b = a;如代码中所示:变量(int a)是从内部类中加入的,需要声明为final(int b)。如何以简单的方式从变量中获取int?

非常感谢所有帮助:) 感谢。

3 个答案:

答案 0 :(得分:0)

这是一个建议,让你的班级实现Runnable,如下所示:

public class MyClass implements Runnable
{
    int a;

    public void use()
    {
        Thread thread = new Thread(this);
        thread.start();
    }

    public void run()
    {
        try
        {
            //do something
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

这样,变量' a'在您的Thread和您的函数中都可见。在run()结束时,您可以调用设置b = a;或类似内容的函数,在这种情况下,b应该与顶部一起定义,但我不确定您是什么努力实现,所以你可以成为法官。

答案 1 :(得分:0)

您可以使用LocalBroadcastManagerEventBus将工作线程的结果报告回主/ ui线程。

N.B:这取决于上下文,但创建自己的“Runnable”线程可能不是在Android上进行线程化的最佳方式。

答案 2 :(得分:0)

我在您的代码中看到了一个问题。也就是说,当你指定b = a时,可能线程还没有完成,所以变量b得到错误的值。为了解决问题,我认为你可以在一个单独的线程中运行整个use()方法。

如果你还想运行它们的某些行,你可以试试这个样本:

class Wrapper {
    // Use wrapper for change the value of final primary variable
    int a;
}

public void use() {
    final Wrapper a = new Wrapper();
    Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            a.a = 120;
        }
    });
    t.start();

    // Block current thread until t finish
    // So make sure b get the right value
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    int b = a.a;
}