2015-11-05 89 views
0

我想在微调控制器进度条完成后按钮单击更新TextView的文本。TextView没有得到更新ProgressBar

public void launchRingDialog(View view) { 

     final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Please wait ...", "Downloading File ...", true); 
     ringProgressDialog.setCancelable(true); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String text; 
        int build_num = android.os.Build.VERSION.SDK_INT; 
        Set buildNumbers = getSharedPreferenceData(build_numbers); 
        boolean result = isPresent(buildNumbers, 
          build_num); 
        if (result) { 
         text = "Present"; 
        } else { 
         text = "Not Present"; 
        } 
        //Thread.sleep(5000); 
        System.out.println("Text After button click"); 
        System.out.println(text); 

        TextView compliance = (TextView) findViewById(R.id.compliance); 
        compliance.setText(text); 

       } catch (Exception e) { 

       } 
       ringProgressDialog.dismiss(); 
      } 
     }).start(); 
    } 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if (v.getId() == R.id.download_file) { 
      System.out.println("Inside button click"); 
      launchRingDialog(v); 
     } 
} 

在onCreate中,我检查内部编号,并将文本设置为“Present”。但是,当我做的按钮点击,sharedPreference文件被改变了,我检查,返回“不存在于当前的版本号,这是没有得到体现在TextView的。

它的线程在这里创造出了问题?

+0

这可能会导致一个问题'catch(Exception e){}'在那里放一个日志,我确定哟你会看到你得到一个例外。 '.setText()'应该放在'runOnUiThread()' – codeMagic

回答

1

的问题在于你试图从另一个线程调用方法compliance.setText(text),这在Android上是不允许的,对于你想要做的事情,你应该真的使用AsyncTask而不是启动你自己的线程。类似这样的:

public void launchRingDialog(View view) { 

     final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Please wait ...", "Downloading File ...", true); 
     ringProgressDialog.setCancelable(true); 

     new AsyncTask<Void,Void,String>(){ 

      @Override 
      protected String doInBackground(Void... params) { 

       String text; 
       int build_num = android.os.Build.VERSION.SDK_INT; 
       Set buildNumbers = getSharedPreferenceData(build_numbers); 
       boolean result = isPresent(buildNumbers, 
         build_num); 
       if (result) { 
        text = "Present"; 
       } else { 
        text = "Not Present"; 
       } 

       return text; 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       TextView compliance = (TextView) findViewById(R.id.compliance); 
       compliance.setText(s); 
       ringProgressDialog.dismiss(); 
      } 
     }.execute(); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if (v.getId() == R.id.download_file) { 
      System.out.println("Inside button click"); 
      launchRingDialog(v); 
     } 
    } 
+0

里面我可以假设,如果我必须使用多线程来更新某些元素,我必须使用AsyncTask而不是我自己的线程? – user3089927

+0

此外,我得到11-05 13:11:22.220:我/编舞(1928):跳过45帧!应用程序可能在其主线程上做了太多工作。 和微调器花费太多时间退出。有什么理由呢?我必须在对话框外点击退出微调器。 – user3089927

+1

您也可以使用常规的Thread类。但是,这个问题是,你必须做一些额外的工作,以确保你的应用程序不会崩溃。你将不得不使用在UI线程中实例化的Handler,并且每当你想操纵UI组件时都会发送一条消息给那个。出于这个原因,他们创建了AsyncTask,使用起来要简单得多。我发现很少有特殊情况,我想从头开始创建自己的线程。 – mylovemhz