我想知道我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的线程中调用?
我试图绕过线程,我知道我可以使用a Handler来发送消息/ runnables MessageQueue,然后由它接收Looper并发送回处理程序进行处理.
如果我发布到一个处理器在我的活动,是Activity,Handler,MessageQueue并且Looper在UI线程上所有正在运行的?如果没有,有人可以解释这一切是如何结合在一起的吗?:)
我在以下程序中使用处理程序,我想在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) 我有一个应用程序,其功能A应该每分钟在后台运行.功能A是应用程序应该连接到数据库,读取一些数据然后获取设备的当前位置,并根据它们检查条件,如果条件为真,它应该向用户发送状态栏通知,以便用户点击通知,将显示应用程序的用户界面并发生一些事情.
这个后台任务应该每分钟都运行一次,无论应用程序是否被使用,关闭,终止(例如facebook或Whatsapp向我们显示通知,无论它们是否在应用程序堆栈中).
现在我已经搜索并发现Android提供Job Scheduler,后台服务,AlarmManager和处理程序.
但是我读到的越多,这些陈述对我来说就越矛盾.
android background-process alarmmanager android-handler android-jobscheduler
我想从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
我已经基于一个函数创建了一个图像上传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) 有一种服务可以听取一些声音.如果语音匹配字符串,则在服务对象中调用某个方法.
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对象中的方法?我不希望从活动到服务的访问,而是从服务到活动.我已经阅读过有关处理程序和广播公司的内容,但无法找到/理解任何示例.有任何想法吗?
我随机获得空指针异常,通常它工作,有时它崩溃,我搜索了很多,但没有得到任何帮助,因为它没有正确的线从我得到任何帮助,
我也在使用处理程序.
我的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) 我有一个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) 我在我的应用程序中使用Loader,并根据我使用此Loader在COntacts上执行的查询得到的结果,我执行一些计算并将它们存储回Sqlite DB中.我希望这个操作是异步的,但我在使用Async任务之间感到困惑,因为我要返回很多不同的数据类型,或者我应该使用简单的处理程序或AsyncTaskLoader,我希望它很简单,因为我是新手装载机.我试图搜索AsyncTaskLoader的例子,但它似乎是火箭科学,在我的场景的上下文中的三个中的任何一个的基本和简单的功能示例将是非常有帮助的.
android ×10
android-handler ×10
alarmmanager ×1
handler ×1
java ×1
performance ×1
postdelayed ×1
textview ×1