Android 如何从处理程序启动意图或线程?
我有一个客户机/服务器应用程序,它需要能够启动生命周期在10秒到24小时之间的各种线程。我的TCP连接在后台线程中运行,工作正常,但我不知道如何从绑定到TCP线程的处理程序内部启动各个线程。处理程序可以很好地显示服务器发送的测试字符串,但我无法让Java接受我从该处理程序内部启动任何东西。我尝试了一个intent、runOnUIThread和一个标准线程,每个线程都是独立的,但它总是抱怨对非静态字段的静态引用。我理解静态变量,但不确定这里讲的是什么。我已将错误消息作为注释添加到我发布的代码中。谢谢Android 如何从处理程序启动意图或线程?,android,multithreading,android-intent,handler,Android,Multithreading,Android Intent,Handler,我有一个客户机/服务器应用程序,它需要能够启动生命周期在10秒到24小时之间的各种线程。我的TCP连接在后台线程中运行,工作正常,但我不知道如何从绑定到TCP线程的处理程序内部启动各个线程。处理程序可以很好地显示服务器发送的测试字符串,但我无法让Java接受我从该处理程序内部启动任何东西。我尝试了一个intent、runOnUIThread和一个标准线程,每个线程都是独立的,但它总是抱怨对非静态字段的静态引用。我理解静态变量,但不确定这里讲的是什么。我已将错误消息作为注释添加到我发布的代码中。谢
static Handler TCP_handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
Message.obtain();
Bundle bundle = msg.getData();
switch( msg.what ){
case 1: // this stuff works fine
String aResponse1 = bundle.getString("messageStringL1");
String aResponse2 = bundle.getString("messageStringL2");
if(aResponse1 != null)
textViewLineOne.setText(aResponse1);
if(aResponse2 != null)
textViewLineTwo.setText(aResponse2);
break;
case 2:
// Method 1
// error: “No enclosing instance of the type MainActivity is accessible in scope”
Intent i = new Intent(MainActivity.this, IdleScreen.class);
// if I take out "MainActivity.this" I get the error “static reference to the non-static method”
MainActivity.this.startActivity(i);
// Method 2
// error: Cannot make a static reference to the non-static method runOnUiThread(Runnable) from the type Activity
MainActivity.runOnUiThread(IdleScreen);
// Method 3
// error: “Cannot make a static reference to the non-static field IdleObj.”
// If I make my Idleobj static it compiles but the thread never runs
IdleObj = new IdleScreen();
Thread IdleScreenThead = new Thread();
IdleScreenThead.start();
break;
}
}
};
更新:我删除了static并在我的TCP类中创建了一个对象,以便该类可以看到位于MainActivity中的我的处理程序。我现在可以从处理程序启动线程,但是如果没有运行时错误和NullPointerException,我就无法启动Intent;通过一个按钮,意图可以很好地工作。我尝试将上下文保存在MainActivity的onCreate中,并使用它来代替MainActivity。这会导致相同的崩溃。我认为我需要工作意图的原因是,当我启动每个不同的线程时,我可以包括一个新的屏幕(活动),用户可以在其中使用键盘或从列表中进行某种选择,等等。我在这里走的是正确的路吗,还是需要一些新的想法
//如果从TCP_处理程序调用,这会给我一个NullPointerException,但如果从按钮调用,则效果很好。
意图i=新意图(MainActivity.this、IdleScreen.class)星触觉(i) 静态处理程序是个坏主意,尤其是当您想要与用户界面交互时。 当应用程序进入后台并销毁应用程序的所有活动时,您将怎么做 如果需要终身对象,最好的方法是在类的子类中创建它,并重写方法onCreate(),在这里可以实例化某个对象并将其引用给扩展上下文类的应用程序。还要为其对象创建getter 当活动启动时,您可以调用getApplication()方法,然后将其转换为应用程序的类名,并通过getter获取所需的对象。您可以使用这种方式传递对活动的引用。但不要忘记在调用活动的onPause时通知该对象——这意味着活动将很快被销毁 还有一个-如果使用自定义的,则应该在清单中指定应用程序类
应用程序类。您正在将
处理程序TCP\u处理程序定义为静态
,这意味着它无权访问外部类的此
实例(我猜是MainActivity
)。您的思路是正确的。删除静态指定并在TCP类中创建MainActivity对象使我能够连接。仍然无法使用意图,但至少我已经达到了目的。谢谢你提供的信息。保持这东西24/7运行是我关心的问题。它通常在15分钟左右后停止,但没有给我反馈。我不明白你写的大部分内容,但这给了我一个开始思考的地方。如果您能补充更多,我们将不胜感激。谢谢