我收到错误: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?
非常感谢所有帮助:) 感谢。
答案 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)
您可以使用LocalBroadcastManager或EventBus将工作线程的结果报告回主/ 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;
}