Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.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 IntentService的清晰性_Android_Android Service_Android Preferences_Intentservice - Fatal编程技术网

Android IntentService的清晰性

Android IntentService的清晰性,android,android-service,android-preferences,intentservice,Android,Android Service,Android Preferences,Intentservice,我有一个扩展IntentService的服务 public class RefreshService extends IntentService { static final String TAG = "RefreshService"; public RefreshService() { super(TAG); } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreated")

我有一个扩展IntentService的服务

public class RefreshService extends IntentService {

static final String TAG = "RefreshService";

public RefreshService() {
    super(TAG);
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreated");
}



@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroyed");
}

@Override
public IBinder onBind(Intent intent) {
    return  null;
}

@Override
protected void onHandleIntent(Intent intent) {

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    final String username = prefs.getString("username", "").trim();
    final String password = prefs.getString("password", "").trim();

    Log.d(TAG, "onDestroyeds");

    if (TextUtils.isEmpty(username) || (TextUtils.isEmpty(password))){
        Toast.makeText(this, "Please update your username and password", Toast.LENGTH_LONG ).show();
        return;
    }

   // here code for fetching data and inserting into db.

}
}

当设置丢失时,我得到以下错误,而不是显示toast消息

 07-12 18:28:33.125    2961-2961/com.example.krishna.yamba I/menu_item_selected﹕ [0,Refresh]
07-12 18:28:33.143    2961-2961/com.example.krishna.yamba D/RefreshService﹕ onCreated
07-12 18:28:33.147    2961-3637/com.example.krishna.yamba D/RefreshService﹕ onDestroyeds
07-12 18:28:33.147    2961-3637/com.example.krishna.yamba D/RefreshService﹕ onDestroyeds
07-12 18:28:33.181    2961-2961/com.example.krishna.yamba D/RefreshService﹕ onDestroyed
07-12 18:28:33.197    2961-3637/com.example.krishna.yamba W/MessageQueue﹕ Handler (android.view.ViewRootImpl$ViewRootHandler) {38f6505f} sending message to a Handler on a dead thread
    java.lang.IllegalStateException: Handler (android.view.ViewRootImpl$ViewRootHandler) {38f6505f} sending message to a Handler on a dead thread
            at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)
            at android.os.Handler.enqueueMessage(Handler.java:631)
            at android.os.Handler.sendMessageAtTime(Handler.java:600)
            at android.os.Handler.sendMessageDelayed(Handler.java:570)
            at android.os.Handler.post(Handler.java:326)
            at android.view.ViewRootImpl.loadSystemProperties(ViewRootImpl.java:5413)
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:378)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:253)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.widget.Toast$TN.handleShow(Toast.java:414)
            at android.widget.Toast$TN$1.run(Toast.java:322)
            at android.os.Handler.handleCallback(Handler.java:738)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.os.HandlerThread.run(HandlerThread.java:61)
07-12 18:28:33.125 2961-2961/com.example.krishna.yamba I/menu\u item\u selected﹕ [0,刷新]
07-12 18:28:33.143 2961-2961/com.example.krishna.yamba D/RefreshService﹕ 再次创建
07-12 18:28:33.147 2961-3637/com.example.krishna.yamba D/RefreshService﹕ OnDestroyes
07-12 18:28:33.147 2961-3637/com.example.krishna.yamba D/RefreshService﹕ OnDestroyes
07-12 18:28:33.181 2961-2961/com.example.krishna.yamba D/RefreshService﹕ 未经处理
07-12 18:28:33.197 2961-3637/com.example.krishna.yamba W/MessageQueue﹕ 处理程序(android.view.ViewRootImpl$ViewRootHandler){38f6505f}向死线程上的处理程序发送消息
java.lang.IllegalStateException:处理程序(android.view.ViewRootImpl$ViewRootHandler){38f6505f}正在向死线程上的处理程序发送消息
位于android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)
位于android.os.Handler.enqueueMessage(Handler.java:631)
位于android.os.Handler.sendMessageAtTime(Handler.java:600)
位于android.os.Handler.sendMessageDelayed(Handler.java:570)
位于android.os.Handler.post(Handler.java:326)
在android.view.ViewRootImpl.loadSystemProperties上(ViewRootImpl.java:5413)
在android.view.ViewRootImpl。(ViewRootImpl.java:378)
在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:253)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
位于android.widget.Toast$TN.handleShow(Toast.java:414)
在android.widget.Toast$TN$1.run(Toast.java:322)
位于android.os.Handler.handleCallback(Handler.java:738)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:135)
运行(HandlerThread.java:61)
我假设以下是真的

  • onHandleIntent方法中的代码在不同的线程上运行
  • 因此,在这里做一些密集的任务是可以的。(在本例中,我只是获取和更新数据库)
  • 当设置正确时,一切正常。那么,将toast消息与获取和更新相比较应该不是问题,对吗

    设置为空时如何放置祝酒词

    onHandleIntent方法中的代码在不同的线程上运行

    因此,在这里做一些密集的任务是可以的。(在本例中,我只是获取和更新数据库)

    那么,将toast消息与获取和更新相比较应该不是问题,对吗

    否,因为您无法从后台线程引发
    Toast
    。事实上,这就是错误告诉你的

    设置为空时如何放置祝酒词

    正确的答案是不要使用
    Toast
    。这是告诉用户错误情况的第二糟糕的解决方案(最糟糕的是根本不想告诉用户)。无法保证当
    Toast
    可读时,用户会碰巧在某个时间点浏览屏幕,因此用户可能会错过消息。使用一个或一些东西

    无论如何,您需要安排让主应用程序线程以某种方式更新UI。。。如果你的用户界面恰好在前台。实现这一点的现代解决方案通常涉及某种事件总线。目前有三种主要的事件总线实现:

    • LocalBroadcastManager
      ()
    • 绿色机器人的事件总线()
    • 广场的奥托()
    我链接到的示例应用程序都演示了UI或-
    通知
    模式,如果我们碰巧在前台,我们会更新用户界面,或者如果我们在前台没有UI,我们会发出
    通知
    ,让用户知道事件

    onHandleIntent方法中的代码在不同的线程上运行

    因此,在这里做一些密集的任务是可以的。(在本例中,我只是获取和更新数据库)

    那么,将toast消息与获取和更新相比较应该不是问题,对吗

    否,因为您无法从后台线程引发
    Toast
    。事实上,这就是错误告诉你的

    设置为空时如何放置祝酒词

    正确的答案是不要使用
    Toast
    。这是告诉用户错误情况的第二糟糕的解决方案(最糟糕的是根本不想告诉用户)。无法保证当
    Toast
    可读时,用户会碰巧在某个时间点浏览屏幕,因此用户可能会错过消息。使用一个或一些东西

    无论如何,您需要安排让主应用程序线程以某种方式更新UI。。。如果你的用户界面恰好在前台。实现这一点的现代解决方案通常涉及某种事件总线。目前主要有三种事件总线实现:

    • LocalBroadcastManager
      ()
    • 绿色机器人的事件总线()
    • 广场的奥托()

    我链接到的示例应用程序都演示了UI或-
    通知
    模式,如果我们恰好在前台,我们将更新用户界面,或者,如果前台没有UI,我们会发出
    通知
    ,让用户知道事件。

    IntentService
    在单独的线程上执行其OnHandleContent。另一方面,
    Toast
    在主/UI线程上运行。要在
    IntentService
    中显示
    Toast
    ,您需要执行以下操作:

    new Handler(Looper.getMainLooper()).post(new Runnable() {           
        @Override
        public void run() {
            Toast.makeText(RefreshService.this, "Toast msg here", Toast.LENGTH_LONG).show();
        }
    });
    

    IntentService
    execute