从不同线程获取变量 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;
}
我收到错误: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;
}