2012-05-28 81 views
2

我想显示一个使用线程的进度条..我accpt,我没有那么多的线程概念。使用线程显示进度条

这里是运行logcat的消息代码

enter code here 

package com.integrated.mpr; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class Progress extends Activity { 


    static String[] display; 

    private static final int Progress = 0; 

    private ProgressBar mProgress; 
    private int mProgressStatus = 0; 

    private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.progress); 


     mProgress = (ProgressBar) findViewById(R.id.progressBar); 

     // Start lengthy operation in a background thread 
     new Thread(new Runnable() { 
      public void run() { 
       while (mProgressStatus < 100) { 
        mProgressStatus = doWork(); 

        // Update the progress bar 
        mHandler.post(new Runnable() { 
         public void run() { 
          mProgress.setProgress(mProgressStatus); 
         } 
        }); 
       } 
      } 

      private int doWork() { 

       display = new Logic().finaldata(); 
       // TODO Auto-generated method stub 
       return 100; 
      } 
     }).start(); 
    } 
} 

了java.lang.RuntimeException:内螺纹无法创建处理程序尚未调用Looper.prepare()

我在做什么错误? PLZ帮助

+0

你能粘贴错误的详细信息和'display = new Logic()。finaldata();'它做了什么?从你粘贴的代码,我找不到原因发生'不能创建处理程序内部线程没有调用Looper.prepare()' – idiottiger

回答

3

所以你的问题将在别处。我用Handler试了你的例子,它适用于我。

package com.sajmon.threadsDemo; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

    public class ThreadsDemoActivity extends Activity { 

     ProgressBar bar; 
     TextView label; 
     Handler handler = new Handler(); 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      bar = (ProgressBar) findViewById(R.id.progBar); 

      new Thread(new Runnable() { 

       int i = 0; 
       int progressStatus = 0; 

       public void run() { 
        while (progressStatus < 100) { 
         progressStatus += doWork(); 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 

         // Update the progress bar 
         handler.post(new Runnable() { 
          public void run() { 
           bar.setProgress(progressStatus); 
           i++; 
          } 
         }); 
        } 
       } 
       private int doWork() { 

        return i * 3; 
       } 

       }).start();   

     } 
    } 

和xml:

<ProgressBar 
     android:id="@+id/progBar" style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     /> 

所以看这一点,编辑与此相似的代码。

+0

所以基本上我应该替换 新线程(新Runnable())与 Activity.runOnUIThread(new Runnable()) 我是否正确? – Kumar

+0

等我编辑帖子。 – Sajmon

+0

ty Sajmon我正在编辑我的代码..让我们希望它的作品 – Kumar

1

使用线程

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class ThreadDemo1ProgressBar extends Activity 
{ 
    ProgressBar bar; 
    TextView msgWorking; 
    boolean isRunning = false; 

    Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      bar.incrementProgressBy(5); 
      if (bar.getProgress() == bar.getMax()) { 
       msgWorking.setText("Done"); 
       bar.setVisibility(View.INVISIBLE); 
      } else { 
       msgWorking.setText("Working..." + 
         bar.getProgress()); 
      } 
     }// handleMessage 
    }; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     bar = (ProgressBar) findViewById(R.id.progress); 
     bar.setMax(100); 
     msgWorking = (TextView) findViewById(R.id.TextView01); 
    } 

    public void onStart() { 
     super.onStart(); 
     bar.setProgress(0); 

     Thread background = new Thread(new Runnable() { 
      public void run() { 
       try 
       { 
        for (int i = 0; i < 20 && isRunning; i++) { 

         Thread.sleep(1000); 
           handler.sendMessage(handler.obtainMessage()); 
        } 
       } 
       catch(Throwable t) { 
        // just end the background thread 
       } 
      } 
     }); 
     isRunning = true; 
     background.start(); 
    }// onStart 

    public void onStop() { 
     super.onStop(); 
     isRunning = false; 
    } 
}// ThreadDemo1ProgressBar 

查找进度条更新下面的示例中代码的约示例更新为每5秒钟的进度条。

0

我其实只是创建一个线程实例,它无论如何工作。此代码已写入启动活动中。您只需拨打showSpinner1()方法即可显示/隐藏微调器。

确保在您的onCreate()方法中执行此操作 getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);,并使用此代码切换微调开关。

// Spinner related code - The thread is created just once and is used multiple times (works!!) 
boolean toShow = false; 
Thread spinner1Thread = new Thread("Show/Hide Spinner Thread") { 

    @Override 
    public void run() { 
     setProgressBarIndeterminateVisibility(toShow); 
    } 

}; 

/** 
* Shows and hides the spinner 
* @param pShow 
*/ 
public void showSpinner1(boolean pShow) { 
    toShow = pShow; 
    runOnUiThread(spinner1Thread); 
}