簡體   English   中英

Android在片段中使用進度條

[英]Android using progress bar in a fragment

我一直試圖制作一個可以在加載進度條時檢索​​圖像的片段。 但是,當片段調用doWork()時,它會使應用程序崩潰。 圖像的導入說明存在問題。 我嘗試使用簡單的東西,例如僅顯示Toast並崩潰。

(這在活動中效果很好,但在片段中效果不佳)

這是我的代碼:

主要活動:

    public class MainActivity extends FragmentActivity {



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


    }

    public void setLayout(View view){
        PictureLoader pictureLoader = new PictureLoader();  
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        transaction.replace(R.id.fragmentContainer, pictureLoader);
        transaction.commit();   
    }
}

分段:

public class PictureLoader extends Fragment{
    ImageView iv;
    ProgressBar progress;
    int progressStatus;
    Handler mHandler;
    int progressValue;

    @Override
    public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.photo_loader,container, false);

    progress = (ProgressBar)view.findViewById(R.id.progressBar1);
    mHandler = new Handler();
     progress.setVisibility(View.GONE);

    iv = (ImageView)view.findViewById(R.id.imageView1);
        loadImage();
    return view;

    }

public void loadImage(){

    progress.setVisibility(View.VISIBLE);
     new Thread(new Runnable() {
         public void run() {


             while (progressStatus < 100) {
                 progressStatus = doWork();

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

             if (progressStatus >= 100) {
                 progress.setVisibility(View.GONE);

             }
         }

        private int doWork() {

                File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                File outputDir = new File(picturesDir, "All pictures");
                Bitmap bitmap = BitmapFactory.decodeFile(outputDir.getPath() + "/" + "IMG_201407211_183804.jpg");
                iv.setImageBitmap(bitmap);
            Toast.makeText(getActivity(), "Done", Toast.LENGTH_LONG).show();
                return 100;
        }
     }).start();


}


}

日志:

08-09 13:35:16.172: D/(4138): HostConnection::get() New Host Connection established 0xb9223bc0, tid 4138
08-09 13:35:16.172: D/libEGL(4138): loaded /system/lib/egl/libGLESv1_CM_emulation.so
08-09 13:35:16.192: D/libEGL(4138): loaded /system/lib/egl/libGLESv2_emulation.so
08-09 13:35:16.302: W/EGL_emulation(4138): eglSurfaceAttrib not implemented
08-09 13:35:16.362: D/OpenGLRenderer(4138): Enabling debug mode 0
08-09 13:35:20.402: D/dalvikvm(4138): GC_FOR_ALLOC freed 65K, 10% free 2852K/3140K, paused 68ms, total 71ms
08-09 13:35:20.512: D/dalvikvm(4138): GC_FOR_ALLOC freed 9K, 10% free 2975K/3272K, paused 48ms, total 49ms
08-09 13:35:20.522: I/dalvikvm-heap(4138): Grow heap (frag case) to 4.289MB for 1228812-byte allocation
08-09 13:35:20.592: D/dalvikvm(4138): GC_FOR_ALLOC freed <1K, 7% free 4174K/4476K, paused 65ms, total 65ms
08-09 13:35:20.722: W/dalvikvm(4138): threadid=11: thread exiting with uncaught exception (group=0xb0eaf648)
08-09 13:35:20.732: E/AndroidRuntime(4138): FATAL EXCEPTION: Thread-219
08-09 13:35:20.732: E/AndroidRuntime(4138): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:837)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.view.View.requestLayout(View.java:15792)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.widget.ImageView.setImageDrawable(ImageView.java:422)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at android.widget.ImageView.setImageBitmap(ImageView.java:437)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at com.example.photoloader.PictureLoader$1.doWork(PictureLoader.java:70)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at com.example.photoloader.PictureLoader$1.run(PictureLoader.java:49)
08-09 13:35:20.732: E/AndroidRuntime(4138):     at java.lang.Thread.run(Thread.java:841)

我希望你能幫助我。 謝謝

該行從后台線程執行。 但是它涉及UI元素,因此將崩潰。

progress.setVisibility(View.GONE);

只有UI線程可以觸摸UI窗口小部件。

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

改為這樣做:

 if (progressStatus >= 100) {
     mHandler.post(new Runnable() {
         public void run() {
            progress.setVisibility(View.GONE);
         }
     });
 }

它不會崩潰了,但是您應該真正了解AsyncTask。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM