【问题标题】:Splash screen doesn't display logo : thread.execute.get()启动画面不显示徽标:thread.execute.get()
【发布时间】:2014-05-15 21:56:30
【问题描述】:

我的启动画面同步我的应用程序:

当我使用时:

sd.execute("init_sync", null).get();

我的徽标(在 xml 中定义)消失了。如果我退出 .get(),它就会出现。

这是我的代码:

 public class SplashScreen extends Activity {
private Context ctx = null;
private Usuario mUser = null;
SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ctx = this;
    prefs = PreferenceManager.getDefaultSharedPreferences(this);

    new Handler().post(new Runnable() {

        @Override
        public void run() {
            // Check if user exists
            Gson gson = new Gson();
            String jsonUser = prefs.getString("usuario", "");
            mUser = gson.fromJson(jsonUser, Usuario.class);

            if (NetworkUtils.isOnline(ctx)) {
                if (mUser != null) {
                    SyncData sd = new SyncData(ctx);
                    try {
                        sd.execute("init_sync", null).get();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }

                } else {
                    Intent i = new Intent(SplashScreen.this, LoginActivity.class);
                    startActivity(i);
                }

            } else {
                if (mUser != null) {

                    Intent i = new Intent(SplashScreen.this, DashBoard.class);
                    startActivity(i);
                } else {
                    Toast.makeText(ctx, "Necesita Internet para loguearse", Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
    });

}

}

我有几个 asyncTask 用于上传图片,并将 MySQL 数据库与我的 SQLite 数据库同步。所以,我需要等到所有进程结束才能知道是否有任何错误。

问题是我把它放在一个线程中,这样它就不会影响 UI。我哪里错了?

【问题讨论】:

    标签: android multithreading android-asynctask


    【解决方案1】:

    当您使用get() 时,它会导致 UI 线程等待。不要使用get()。您需要覆盖AsyncTask 中的onPostExecute 方法。

    private Boolean task1Finished = false;
    private Boolean task2Finished = false;
    private Boolean task3Finished = false;
    
    //...
    
    SyncData sd1 = new SyncData(ctx) {
        @Override
        protected void onPostExecute(Object result) {
            task1Finished = true;
            goToNextActivity();
        }
    };
    
    SyncData sd2 = new SyncData(ctx) {
        @Override
        protected void onPostExecute(Object result) {
            task2Finished = true;
            goToNextActivity();
        }
    };
    
    SyncData sd3 = new SyncData(ctx) {
        @Override
        protected void onPostExecute(Object result) {
            task3Finished = true;
            goToNextActivity();
        }
    };
    
    try {
        sd1.execute();
        sd2.execute();
        sd3.execute();
    } 
    catch (InterruptedException e) {
        e.printStackTrace();
    } 
    catch (ExecutionException e) {
        e.printStackTrace();
    }
    
    //...
    
    private void goToNextActivity() {
        if (task1Finished && task2Finished && task3Finished)
            // all tasks complete
    }
    

    【讨论】:

    • 其实我已经定义了onPostExecute,但没那么简单,因为我必须等待几个Async Task完成才能打开下一个屏幕。但是自己activity的logo应该显示no???
    • 我不知道您的徽标是什么,但您说get 是导致它不出现的原因。如果您必须等待几个 AsyncTasks,那么您需要调用 onPostExecute 中的下一个,或者为它们中的每一个设置布尔标志并检查每个 onPostExecute 中的标志,然后再进行下一个 Activity。 AsyncTasks 实际上并不并行运行。
    • 我编辑了适用于多个 AsyncTasks 的答案。
    • 不幸的是,它有点复杂,因为我不知道线程数...... Tx 帮忙!我试图将 .get() 放在 onStart() 或 onResume() 中,但它不起作用:(
    • 你不是把它放在一个新线程中,你是从 UI 线程调用它。
    【解决方案2】:

    就像@ashishduh 所说,我在 UI 线程中。所以我改变了:

    new Handler().post(new Runnable() {
    @Override
            public void run() {
    ....
         }
    }
    

    Runnable sync = new Runnable() {
            @Override
            public void run() {
     ....
         }
    };
    
    Thread t = new Thread(sync);
    t.start();
    

    它解决了我的问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2018-12-07
      • 2014-01-22
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多