[英]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.