Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从处理程序启动意图或线程?_Android_Multithreading_Android Intent_Handler - Fatal编程技术网

Android 如何从处理程序启动意图或线程?

Android 如何从处理程序启动意图或线程?,android,multithreading,android-intent,handler,Android,Multithreading,Android Intent,Handler,我有一个客户机/服务器应用程序,它需要能够启动生命周期在10秒到24小时之间的各种线程。我的TCP连接在后台线程中运行,工作正常,但我不知道如何从绑定到TCP线程的处理程序内部启动各个线程。处理程序可以很好地显示服务器发送的测试字符串,但我无法让Java接受我从该处理程序内部启动任何东西。我尝试了一个intent、runOnUIThread和一个标准线程,每个线程都是独立的,但它总是抱怨对非静态字段的静态引用。我理解静态变量,但不确定这里讲的是什么。我已将错误消息作为注释添加到我发布的代码中。谢

我有一个客户机/服务器应用程序,它需要能够启动生命周期在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分钟左右后停止,但没有给我反馈。我不明白你写的大部分内容,但这给了我一个开始思考的地方。如果您能补充更多,我们将不胜感激。谢谢