标签: android-handler

何时使用handler.post()&何时使用新的Thread()

我想知道我handler.post(runnable);应该何时使用,何时使用 new Thread(runnable).start();

在Handler的开发人员文档中提到:

导致Runnable r添加到消息队列中.runnable将在连接此处理程序的线程上运行.

这是否意味着,如果我写onCreate()Activity类:

Handler handler = new Handler();
handler.post(runnable);
Run Code Online (Sandbox Code Playgroud)

然后runnable将在一个单独的线程或Activity的线程中调用?

android android-handler android-thread

56
推荐指数
4
解决办法
7万
查看次数

处理程序,MessageQueue,Looper,它们都在UI线程上运行吗?

我试图绕过线程,我知道我可以使用a Handler来发送消息/ runnables MessageQueue,然后由它接收Looper并发送回处理程序进行处理.

如果我发布到一个处理器在我的活动,是Activity,Handler,MessageQueue并且Looper在UI线程上所有正在运行的?如果没有,有人可以解释这一切是如何结合在一起的吗?:)

multithreading android android-handler android-looper

39
推荐指数
2
解决办法
2万
查看次数

如何停止Handler Runnable?

我在以下程序中使用处理程序,我想在i = 5时停止它,但处理程序不会停止并连续运行.

   b1.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            handler = new Handler();
           runnable = new Runnable() {
                 public void run() {

                    try {
                        Toast.makeText(getApplicationContext(), "Handler is working", Toast.LENGTH_LONG).show();
                        System.out.print("Handler is working");

                       if(i==5){
                           //Thread.currentThread().interrupt();
                            handler.removeCallbacks(runnable);


                            System.out.print("ok");
                                        Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_LONG).show();
                        }
                       i++;
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
                   handler.postDelayed(this, 5000); 

               }
           };
           handler.postDelayed(runnable, 5000);
           //return;
        }
    });
Run Code Online (Sandbox Code Playgroud)

java performance multithreading android android-handler

33
推荐指数
2
解决办法
6万
查看次数

Job Scheduler与后台服务

我有一个应用程序,其功能A应该每分钟在后台运行.功能A是应用程序应该连接到数据库,读取一些数据然后获取设备的当前位置,并根据它们检查条件,如果条件为真,它应该向用户发送状态栏通知,以便用户点击通知,将显示应用程序的用户界面并发生一些事情.
这个后台任务应该每分钟都运行一次,无论应用程序是否被使用,关闭,终止(例如facebook或Whatsapp向我们显示通知,无论它们是否在应用程序堆栈中).
现在我已经搜索并发现Android提供Job Scheduler,后台服务,AlarmManager处理程序.
但是我读到的越多,这些陈述对我来说就越矛盾.

  1. 关于处理程序我已经读过它们不存在长时间延迟,并将在系统重启后终止.所以它们不适合我的任务.
  2. 但是AlarmManager似乎是这个问题的一个很好的选择,因为当它被允许时,即使在系统重启后它们也存在,并且可以重新运行应用程序.但在Android文档中,Alarm Manager旨在用于必须在特定时间运行的任务(如闹钟).但我的任务必须每分钟运行一次.
  3. 然后是背景服务.这更像是我在阅读后在后台下载的任务,而不是用于我已经解释过的事情.
  4. JobScheduler似乎不适用于必须永久完成的任务,但是对于满足特定约束的任务,例如空闲或没有网络...那么您建议使用哪些(或其他如果存在)对于我在第一部分中解释的任务

android background-process alarmmanager android-handler android-jobscheduler

33
推荐指数
3
解决办法
3万
查看次数

与HandlerThread通信的示例

我想从GUI线程设置一个HandlerThread.然后一段时间后,当在GUI上单击一个按钮时,它会运行callHello(),然后将消息发送到驻留在非GUI线程上的HelloLogger对象,该线程异步记录"Hello World".我已经尝试过很多东西,有些是无限期阻塞,有些是从不接收消息等等.下面的代码或多或少都和我一样接近,请有人修改它吗?

public class HandlerThreadExample {

    private MyHandlerThread mMyHandlerThread;
    private Looper mLooper;
    private Handler mHandler;

    public HandlerThreadExample(){
        mMyHandlerThread = new MyHandlerThread();
        mMyHandlerThread.start();
        mLooper = mMyHandlerThread.getLooper();
    }
    public void callHello() {
        mHandler.sendEmptyMessage(1);
    }
    private class MyHandlerThread extends HandlerThread {
        private HelloLogger mHelloLogger;
        private Handler mHandler;
        public MyHandlerThread() {
            super("The MyHandlerThread thread", HandlerThread.NORM_PRIORITY);
        }
        public void run (){
            mHelloLogger = new HelloLogger();
            mHandler = new Handler(getLooper()){
                public void handleMessage(Message msg){
                    mHelloLogger.logHello();
                }
            };
            super.run();
        }
    }
    private class HelloLogger {
        public HelloLogger …
Run Code Online (Sandbox Code Playgroud)

multithreading android android-handler android-handlerthread

31
推荐指数
1
解决办法
5万
查看次数

Android AsyncTask [无法在未调用Looper.prepare()的线程内创建处理程序

我已经基于一个函数创建了一个图像上传asynctask.上传后,我在onPostExecute上收到此错误.我在Runnable上读了一些Stackoverflow的答案,但我不断反复地得到错误,尽管实现了不同的解决方案.

我的代码:

class uploadFile extends AsyncTask<String, String, String> {
    private ProgressDialog pDialog;

    /**
     * --------------------------------------------------------------------
     * --------------------------------- Before starting background thread
     * Show Progress Dialog
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Uploading file");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * --------------------------------------------------------------------
     * --------------------------------- getting all recent articles and
     * showing them in listview
     */
    @Override
    protected String doInBackground(String... args) {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String existingFileName = Environment.getExternalStorageDirectory() …
Run Code Online (Sandbox Code Playgroud)

android android-asynctask android-handler android-looper

28
推荐指数
2
解决办法
3万
查看次数

如何从服务中调用活动中的方法

有一种服务可以听取一些声音.如果语音匹配字符串,则在服务对象中调用某个方法.

public class SpeechActivationService extends Service {

     public static Intent makeStartServiceIntent(Context pContext){    

         return new Intent(pContext, SpeechActivationService.class);
     }

     //...

     public void onMatch(){
         Log.d(TAG, "voice matches word");
     }

     //...
}
Run Code Online (Sandbox Code Playgroud)

这就是我在我的活动中启动服务的方式:

Intent i = SpeechActivationService.makeStartServiceIntent(this);
startService(i);
Run Code Online (Sandbox Code Playgroud)

从这个服务方法,我如何调用驻留在activity对象中的方法?我不希望从活动到服务的访问,而是从服务到活动.我已经阅读过有关处理程序和广播公司的内容,但无法找到/理解任何示例.有任何想法吗?

android android-intent android-service android-handler

28
推荐指数
2
解决办法
3万
查看次数

尝试在空对象引用上调用虚方法'int android.text.Layout.getLineCount()'

我随机获得空指针异常,通常它工作,有时它崩溃,我搜索了很多,但没有得到任何帮助,因为它没有正确的线从我得到任何帮助,

我也在使用处理程序.

我的logcat错误如下,代码添加在它下面,

 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.text.Layout.getLineCount()' on a null object reference
 at android.widget.TextView.onMeasure(TextView.java:6703)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
 at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
 at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
 at android.view.View.measure(View.java:17547)
 at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
 at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
 at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
 at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
 at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
 at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
 at android.view.View.measure(View.java:17547)
 at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
 at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379) …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception textview android-handler

25
推荐指数
1
解决办法
4448
查看次数

如何在android studio中正确使用postDelayed()?

我有一个countDownTimer,如果用户在第12秒内没有点击gameButton我想要调用gameOver方法.问题当countDownTimer为12或者计时器只是不断倒计时,我或者得到名为instamtly的游戏功能.所以我试图使用postDelayed()方法给用户一个完整的秒来点击按钮并让countDownTimer继续,但正如我的代码现在,游戏停在12无论如何.

import android.app.Activity;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;



public class GameScreen extends Activity {

    private TextView time;
    private Button start;
    private Button cancel;
    private Button gameButton;
    private CountDownTimer countDownTimer;
    public static int count = 0;
    public static int countFail = 0;

    final Handler handler = new Handler();
    final Runnable r = new Runnable() {
        public void run() {
            handler.postDelayed(this, 1000);
            gameOver();
        }
    };


    private View.OnClickListener btnClickListener = new View.OnClickListener(){ …
Run Code Online (Sandbox Code Playgroud)

android handler postdelayed android-handler

23
推荐指数
3
解决办法
4万
查看次数

AsyncTaskLoader基本示例.(机器人)

我在我的应用程序中使用Loader,并根据我使用此Loader在COntacts上执行的查询得到的结果,我执行一些计算并将它们存储回Sqlite DB中.我希望这个操作是异步的,但我在使用Async任务之间感到困惑,因为我要返回很多不同的数据类型,或者我应该使用简单的处理程序或AsyncTaskLoader,我希望它很简单,因为我是新手装载机.我试图搜索AsyncTaskLoader的例子,但它似乎是火箭科学,在我的场景的上下文中的三个中的任何一个的基本和简单的功能示例将是非常有帮助的.

android android-asynctask android-handler

22
推荐指数
4
解决办法
5万
查看次数