当前位置: 首页 > 知识库问答 >
问题:

我如何在Android的后台线程上运行代码?

公孙向荣
2023-03-14

我想让一些代码在后台持续运行。我不想在服务中这样做。还有其他可能的方法吗?

我曾尝试在我的活动中调用线程类,但我的活动在后台保留了一段时间,然后就停止了。线程类也停止工作。

class testThread implements Runnable {
        @Override
        public void run() {
            File file = new File( Environment.getExternalStorageDirectory(), "/BPCLTracker/gpsdata.txt" );
            int i = 0;

            RandomAccessFile in = null;

            try {
                in = new RandomAccessFile( file, "rw" );
            } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
//String line =null;
            while ( true ) {
                HttpEntity entity = null;
                try {
                    if ( isInternetOn() ) {
                        while ( ( line = in.readLine() ) != null ) {

                            HttpClient client = new DefaultHttpClient();
                            String url = "some url";
                            HttpPost request = new HttpPost( url );
                            StringEntity se = new StringEntity( line );
                            se.setContentEncoding( "UTF-8" );
                            se.setContentEncoding( new BasicHeader( HTTP.CONTENT_TYPE, "application/json" ) );
                            entity = se;
                            request.setEntity( entity );
                            HttpResponse response = client.execute( request );
                            entity = response.getEntity();
                            i++;
                        }
                        if ( ( line = in.readLine() ) == null && entity != null ) {
                            file.delete();
                            testThread t = new testThread();
                            Thread t1 = new Thread( t );
                            t1.start();
                        }


                    } else {
                        Thread.sleep( 60000 );
                    } // end of else

                } catch (NullPointerException e1) {
                    e1.printStackTrace();
                } catch (InterruptedException e2) {
                    e2.printStackTrace();
                } catch (IOException e1) {
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }// end of while
        }// end of run

    }

共有3个答案

姚浩歌
2023-03-14

我在Brandon Rude的回答中找到了@awardak的一条评论:

new Thread( new Runnable() { @Override public void run() { 
  // Run whatever background code you want here.
} } ).start();

我不确定这是否或如何优于使用AsyncTask。执行,但它似乎对我们有用。如对差异有任何意见,我们将不胜感激。

谢谢,@awardak!

訾渝
2023-03-14

记住跑步背景,连续跑步是两个不同的任务。

对于长期后台进程,线程不是Android的最佳选择。但是,这是代码,请自行承担风险。

为了以正确的方式处理它,您需要首先启动服务,在服务内部,您需要启动需要可运行的线程/异步任务。

请记住,服务和线程将在后台运行,但我们的任务需要触发(一次又一次调用)以获取更新,即一旦任务完成,我们需要调用函数以进行下一次更新。

计时器(周期触发器)、报警(时基触发器)、广播(事件基触发器)、递归将唤醒我们的函数。

public static boolean isRecursionEnable = true;

void runInBackground() {
    if (!isRecursionEnable)
        // Handle not to start multiple parallel threads
        return;

    // isRecursionEnable = false; when u want to stop
    // on exception on thread make it true again  
    new Thread(new Runnable() {
        @Override
        public void run() {
            // DO your work here
            // get the data
            if (activity_is_not_in_background) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // update UI
                        runInBackground();
                    }
                });
            } else {
                runInBackground();
            }
        }
    }).start();
}

使用服务:如果您启动服务,它将启动,它将执行任务,如果服务不粘性,它将在任务执行后自行终止。此服务终止也可能是由代码中的异常或用户从设置中手动终止引起的。

START_STICKY(粘性服务)是Android提供的选项,如果服务终止,服务将自行重启。

还记得多处理和多线程之间的区别吗?服务是一个后台进程(就像没有UI的活动一样),这与在活动中启动线程以避免主线程加载(活动/UI线程)的方式相同,与在服务上启动线程以避免服务加载的方式相同。

在一条语句中,如果希望运行后台继续任务,则需要启动StickyService并在基于事件的服务中运行线程

葛炜
2023-03-14

如果您需要:

>

  • 在后台线程上执行代码

    执行不接触/更新UI的代码

    执行(短)代码,最多需要几秒钟才能完成

    然后使用以下使用AsyncTask的干净高效模式:

    AsyncTask.execute(new Runnable() {
       @Override
       public void run() {
          //TODO your background code
       }
    });
    

  •  类似资料:
    • 问题内容: 这个问题与编程没有严格关系,但是对于程序员来说肯定是重要的。 我写了一个简单的smtp服务器,当我从控制台运行它时,一切都很好,只是它阻止了命令行。 我知道我可以通过运行它 或通过屏幕/ tmux等 但是问题是,我应该如何实现我的程序在后台运行,并且系统管理员可以很高兴地设置和管理该程序? 有些人比我有更多的经验,在golang- nuts上 写道,他们不使用fork等,而是使用mon

    • 问题内容: 我有以下代码行可运行批处理文件, 但是我希望它在后台运行,而不是向用户显示命令行。我该如何更改才能做到这一点? 问题在于命令窗口打开并中断程序GUI。我只希望命令窗口在执行批处理文件时不可见。 问题答案: 完全删除“开始”将完成您想要的操作(因为这就是创建窗口的原因): 我已经对此进行了测试,并且可以正常工作,当然,如果您想与命令提示符进行通信,则必须具有输入和输出流,也不要忘记您的错

    • 在linux中,您可以使用命令

    • 我是线程新手,但我有一个EditText视图,每当它失去焦点时,它就会使用用户从EditText输入的图像徽标填充回收视图。但是,每当用户失去焦点并调用该方法时,一切都会停止一段时间(这意味着我不擅长线程)。如何改进此代码,使其能够顺利运行? 我的活动类: 我的googleRequest类:

    • 我有一个单独的线程在后台运行在C中,我希望它能够发布代码,在另一个已经运行android的线程上运行。操作系统。活套(例如主线)。我所说的“post”是指类似于视图post的东西,其中可运行的排队在事件循环上运行。将要执行的代码也用C编写。 我找到了ALooper API(http://developer.android.com/ndk/reference/group___looper.html)