1

更新ボタンを押したときにプログラムで進行状況ダイアログを表示しようとしていますが、UI階層で作成されたスレッドはそれに触れることしかできないというデバッガーのエラーでアプリケーションが予期せず閉じます。

    public class MainActivity extends Activity {
    Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.refreshView();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void refreshView(){
        ImageView img = (ImageView) findViewById(R.id.imageView1);
        Bitmap bm = null;
        InputStream is = null;
        BufferedInputStream bis = null;
        try 
        {
            URLConnection conn = new URL("http://technomoot.edu.pk/$Common/Image/Content/ciit_logo.jpg").openConnection();
            conn.connect();
            is = conn.getInputStream();
            bis = new BufferedInputStream(is, 8192);
            bm = BitmapFactory.decodeStream(bis);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally {
            if (bis != null) 
            {
                try 
                {
                    bis.close();
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
            if (is != null) 
            {
                try 
                {
                    is.close();
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        }
        img.setImageBitmap(bm);
}

    public void onRefresh(View view) {

        final ProgressDialog dialog = ProgressDialog.show(this,"Loading","Loading the image of the Day");
        Thread th = new Thread(){
            public void run(){
                refreshView();
                handler.post(new Runnable(){
                    public void run(){
                        dialog.dismiss();
                    }
                }
                        );
            }

        };th.start();   
    }

}
4

2 に答える 2

1

非 ui スレッドから ui 操作を呼び出しています。使用できますrunOnUiThread..
またはより良い使用AsynchTask

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    ProgressDialog dialog;
    Context context;

public YourTask(Context context){
    this.context=context;
}

protected void onPreExecute(Object o){
     dialog = ProgressDialog.show(this,"Loading","Loading the image of the Day");
}

protected void doInBackground(Object o){
    refreshView();
}

protected void onPostExecute(Object o){
    img.setImageBitmap(bm);
    dialog.dismiss();
}
}
于 2013-02-17T20:22:30.060 に答える
1

UIfrom workerで操作することはできませんThread! 禁止です!更新したい場合はUI

  • runOnUiThread()
  • AsyncTask

したがって、次のようにしてみてください。

runOnUiThread(new Runnable() {

   @Override
   public void run() {
      // do your work.

   }
});

AsyncTaskより複雑で、型制御などのいくつかの利点を提供するジェネリック型もあります。ここで例を見ることができます:

于 2013-02-17T20:22:38.273 に答える