从不同线程获取变量 android java

getting a variable from a different thread android java

我收到错误:android.os.networkonmainthreadexception。我发现,发生这种情况是因为我必须将 Internet 请求放在主线程以外的线程上。我一直在寻找将它放在单独线程上的方法,并使用了这个,因为我能很好地理解它:

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) 是从内部 class 中访问的,需要声明为 final(int b)。我怎样才能以一种简单的方式从变量中获取 int a outside?

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

这里有一个建议,让你的 class 像这样实现 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 应该与顶部的 a 一起定义,但我不确定您在尝试什么实现,让你来评判。

您可以使用 LocalBroadcastManager or an EventBus 将工作线程的结果报告回 main/ui 线程。

N.B:这取决于上下文,但是创建自己的 "Runnable" 线程可能不是在 Android.

上线程的最佳方式

我发现你的代码有问题。那就是当你赋值 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;
}