Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 ProgressDialog不';使用线程在onCreate中不显示_Android_Multithreading_Thread Safety_Progressdialog - Fatal编程技术网

Android ProgressDialog不';使用线程在onCreate中不显示

Android ProgressDialog不';使用线程在onCreate中不显示,android,multithreading,thread-safety,progressdialog,Android,Multithreading,Thread Safety,Progressdialog,我想在创建活动时加载一些联系人。因为这是一个长时间运行的操作,所以我想通过ProgressDialog通知用户。此应用程序的一个请求是不使用AsyncTasks,因此我使用了线程,但没有显示进度。这是我的onCreate方法: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts)

我想在创建活动时加载一些联系人。因为这是一个长时间运行的操作,所以我想通过ProgressDialog通知用户。此应用程序的一个请求是不使用AsyncTasks,因此我使用了线程,但没有显示进度。这是我的onCreate方法:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contacts);
    handler = new Handler();

    mActionBar = getSupportActionBar();
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    progress = new ProgressDialog(this);
    progress.setMessage("Loading Contacts ");
    progress.setIndeterminate(true);
    progress.show();

    Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            contacts = ContactsUtils.getContacts(getContentResolver());
            handler.post(new Runnable() {
                public void run() {
                    progress.dismiss();
                    // UpdateDisplay();
                };
            });
        }

    });

    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        Log.e("Interrupted Exception:", e.getLocalizedMessage());
    }

    // other methods

}
我错过什么了吗?谢谢


已解决:连接后,onCreate中的其余代码应移动到处理程序,并且连接应被删除

每当您试图从后台线程对UI执行操作时,请使用
处理程序
,或在
rununuithread(Runnable())
中调用它

Try This Code:-


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.launching);


        final ProgressDialog myPd_ring=ProgressDialog.show(Launching.this, "", "Loading please wait..", true);
        myPd_ring.setCancelable(true);
        new Thread(new Runnable() {  
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try
                {
                    Thread.sleep(2000);
                }catch(Exception e){}
                Intent intt=new Intent();
                intt.setClass(Launching.this, MainController.class);
                startActivity(intt);
                finish();
                myPd_ring.dismiss();
            }
        }).start();
    }
progress.show()
另外,您为什么要使用线程?您不认为异步任务可以很好地完成此任务吗

您没有看到进度对话框的原因是

try {
    t.join();
 } catch (InterruptedException e) {
      Log.e("Interrupted Exception:", e.getLocalizedMessage());
 }

这将保留主线程直到任务完成,只需对其进行注释即可尝试以下操作:

private ProgressDialog pDialog; // global
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_launcher);
    color_list = (ListView) this.findViewById(R.id.color_list);
    imageView1 = (ImageView)findViewById(R.id.icon);
    pDialog = new ProgressDialog(Launcher.this);
    pDialog.setMessage("Loading...");
    pDialog.setCancelable(false);

            showProgressDialog();

Thread t = new Thread(new Runnable() {

@Override
public void run() {
    contacts = ContactsUtils.getContacts(getContentResolver());
    handler.post(new Runnable() {
        public void run() {
            hideProgressDialog();
        };
    });
 }

});
}


private void showProgressDialog() {
    if (!pDialog.isShowing())
        pDialog.show();
}

private void hideProgressDialog() {
    if (pDialog.isShowing())
        pDialog.hide();
}

我看到您创建了PD,您在哪里显示它?您在哪里调用
show()
?而且您最好使用AsyncTask我很好奇。为什么不使用AsyncTask?我必须用两种方法。使用异步任务,它可以工作,但我不明白为什么它不能使用线程。我忘了将它粘贴到这里。任务请求指定不允许我使用异步tasks@mawus为什么不使用asynctasks?我必须让我的UI线程等待线程执行,否则我的listProgress对话框中不会显示联系人,除非你让UI线程空闲。您可以通过设置
pd.setCancelable(false)来停止用户取消对话框你是对的,我已经删除了join,并使用了一个处理程序来执行onCreate的其余代码。谢谢我不明白你的问题我是说你的代码进度条是否显示在屏幕上?不,但是进度。isShowed()返回true。。。我认为它与连接有关,因为@nizammoidu saidI需要让我的UI线程等待线程执行,以便加载数据,这就是我使用连接的原因