2011-12-01 6 views
0

앱이 처음 실행될 때 데이터베이스에 데이터를 삽입하려고 했으므로 진행률 막대와 스레드를 만들었지 만 스레드가 실행되지 않고 진행률이 계속 유지되는 것처럼 보입니다. 보여주는 것은 사람이 설명 할 수있는 이유를 들으안드로이드 스레드가 실행되고 있지 않습니다.

내 코드 :

public class HDtvs extends Activity implements Runnable { 
    /** Called when the activity is first created. */ 

    private Button likebutton; 
    private ImageButton about; 
    private ChannelDB mDB; 
    private ListView channellist; 
    private Cursor c; 
    private ProgressDialog d; 
    private String channelS_TABLE; 

    @Override  
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     likebutton=(Button) findViewById(R.id.share); 
     about =(ImageButton)findViewById(R.id.about); 
     channellist = (ListView) findViewById(R.id.Channel); 

     if (tabIsExist(channelS_TABLE) != true){ 
     d=new ProgressDialog(HDtvs.this); 
     d.setMessage("由于您第一次使用,本程序正在创建数据库,请稍后···"); 
     d.show(); 
     /* 启动另一个Thread,运行run() */ 
     Thread thread = new Thread(HDtvs.this); 
     thread.start(); 
     }else{ 
      filldata(); 
      Log.d(this.toString(),"database exist"); 
     } 

    } 


    public void filldata(){ 
     mDB = new ChannelDB(this); 

     String[] columns = {mDB.KEY_ID, mDB.KEY_POSTER, mDB.KEY_CHANNEL, mDB.KEY_PATH, mDB.KEY_DBLINK}; 
     String table = mDB.channelS_TABLE; 

     c = mDB.getHandle().query(table, columns, null, null, null, null, null); 

     startManagingCursor(c); 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       R.layout.channelview, 
       c, 
       new String[] {mDB.KEY_POSTER, mDB.KEY_CHANNEL, mDB.KEY_DBLINK}, 
       new int[] {R.id.poster, R.id.channel, R.id.douban}); 

     adapter.setViewBinder(new ChannelViewBinder()); 

     channellist.setAdapter(adapter); 

     channellist.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       c.moveToPosition(position); 
       Intent intent = new Intent(); 
       intent.setClass(HDtvs.this,Showlist.class); 
       Bundle bunde = new Bundle(); 
       bunde.putString("path",mDB.KEY_PATH); 
       bunde.putString("cname",mDB.KEY_CHANNEL); 
       bunde.putString("dblink",mDB.KEY_DBLINK); 
       /* 将Bundle对象assign给Intent */ 
       intent.putExtras(bunde); 

       startActivity(intent); 
      } 
     }); 
    } 
    private Handler handler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
     d.dismiss(); 

     } 
    }; 

    @Override 
    public void run() 
    { 
     try 
     { 
      mDB.Reset(); 

      insert some data 

      handler.sendEmptyMessage(0);   
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     } 
    } 

} 

답변

2

하면 해당위한 AsyncTask를를 사용하는 것이 더 쉽습니다 :

private class MyTask extends AsyncTask<String, String, String> {... 
: 은 AsyncTask를에서 확장하는 새 내부 클래스 만들기

AsyncTask-Method doInBackground에서 데이터베이스 코드를 입력 할 수 있습니다.

AsyncTask를 new MyTask().execute();과 같이 시작하면됩니다. onCreate. ProgressBar를 사용하려면 onPreExecute, onPostExecute and onProgressUpdate 메쏘드를 살펴볼 필요가 있습니다.

+0

대답은 매우 고무적입니다. 이전에 Asynctask를 시도했지만 나중에 asynctask가 실행될 때 화면이 검게 보이고 아무 것도 보이지 않기 때문에 좋지 않습니다. 해결할 아이디어가 없습니다. 그? – oratis

+0

Coz 지금이 스플래시 화면에이 절차를 적용하고 있으며 더 사용자 친화적 인 스플래시가 필요하지만이 asynctask, plz 도움말, thx를 사용한 후에 스플래시 이미지가 표시되지 않습니다. – oratis

+0

onCreate-Method에서 SplashScreen을 실행 한 다음 AsyncTask를 실행하십시오. onPostExecute에서 다음 활동의 의도를 시작할 수 있습니다. – Thommy

관련 문제