2011-06-24 39 views
0

我創建了一個活動,在此之後,我創建了一個從電話簿讀取的線程,執行一些字符串操作並根據規則在主UI上創建各種按鈕。在Android中爲用戶界面創建新線程

我有下面的代碼,但一些如何終止應用程序。

任何人都可以請幫助我。

public class Phone extends Activity { 
    /** Called when the activity is first created. */ 
    ProgressDialog pbarDialog; 
    LinearLayout ll; 
    Button b; 

    @Override  
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ScrollView sv = new ScrollView(this); 
     ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     sv.addView(ll); 
     setContentView(sv); 
     pbarDialog = new ProgressDialog(this); 
     pbarDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pbarDialog.setMessage("Reading from Phone Book"); 
     pbarDialog.setCancelable(false); 
     pbarDialog.show(); 
     pbarDialog.incrementProgressBy(0);  



     new TheTask().execute();      

    } 


    private class TheTask extends AsyncTask<Void, Integer, Void>{ 

     @Override 
     protected void onPreExecute() { 
      pbarDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pbarDialog.setMessage("Reading from Phone Book"); 
      pbarDialog.setCancelable(false); 
      pbarDialog.show(); 
      pbarDialog.incrementProgressBy(0);   
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      ReadPhoneBook(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      pbarDialog.dismiss(); 
     } 

    }  



    private void ReadPhoneBook() { 
     int i=0;    
     int count=0; 
     //this is a temp function, it just creates buttons, does not read the phone book. 
     for (i=0;i<10;i++) 
     {   
      b = new Button(this); 
      b.setText("Testing");    
      b.setId(1); 
      final Activity self = this; 
      b.setOnClickListener(new OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        initiateACall(v,self); 
       } 
      }); 
      ll.addView(b); 
      if (i%3 == 0){ 
       pbarDialog.incrementProgressBy(30*i/3); 
      } 
     } 

    } 

我收到以下錯誤:使用Android的的AsyncTask類

06-24 21:52:36.274: WARN/dalvikvm(297): threadid=7: thread exiting with uncaught exception (group=0x4001d800) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): FATAL EXCEPTION: AsyncTask #1 06-24 21:52:36.436: ERROR/AndroidRuntime(297): java.lang.RuntimeException: An error occured while executing doInBackground() 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.os.AsyncTask$3.done(AsyncTask.java:200) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.lang.Thread.run(Thread.java:1096) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.ViewRoot.requestLayout(ViewRoot.java:594) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.View.requestLayout(View.java:8125) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.View.requestLayout(View.java:8125) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.View.requestLayout(View.java:8125) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.View.requestLayout(View.java:8125) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.widget.ScrollView.requestLayout(ScrollView.java:1200) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.View.requestLayout(View.java:8125) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.ViewGroup.addView(ViewGroup.java:1863) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.ViewGroup.addView(ViewGroup.java:1822) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.view.ViewGroup.addView(ViewGroup.java:1802) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at ReadPhoneBook(IndiaCalling.java:148) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at access$0(IndiaCalling.java:133) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at $TheTask.doInBackground(IndiaCalling.java:79) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at $TheTask.doInBackground(IndiaCalling.java:1) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at android.os.AsyncTask$2.call(AsyncTask.java:185) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-24 21:52:36.436: ERROR/AndroidRuntime(297): ... 4 more 06-24 21:52:36.564: WARN/ActivityManager(67): Force finishing activity net.WhileOne.IndiaCalling/.IndiaCalling 06-24 21:52:37.534: WARN/InputManagerService(67): Window already focused, ignoring focus gain of: [email protected] 06-24 21:52:39.004: ERROR/WindowManager(297): Activity Phone has leaked window [email protected] that was originally added here 06-24 21:52:39.004: ERROR/WindowManager(297): android.view.WindowLeaked: Activity Phone has leaked window [email protected] that was originally added here 06-24 21:52:39.004: ERROR/WindowManager(297): at android.view.ViewRoot.(ViewRoot.java:247) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.view.Window$LocalWindowManager.addView(Window.java:424) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.Dialog.show(Dialog.java:241) 06-24 21:52:39.004: ERROR/WindowManager(297): at Phone.onCreate(Phone.java:47) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.os.Handler.dispatchMessage(Handler.java:99) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.os.Looper.loop(Looper.java:123) 06-24 21:52:39.004: ERROR/WindowManager(297): at android.app.ActivityThread.main(ActivityThread.java:4627) 06-24 21:52:39.004: ERROR/WindowManager(297): at java.lang.reflect.Method.invokeNative(Native Method) 06-24 21:52:39.004: ERROR/WindowManager(297): at java.lang.reflect.Method.invoke(Method.java:521) 06-24 21:52:39.004: ERROR/WindowManager(297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 06-24 21:52:39.004: ERROR/WindowManager(297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 06-24 21:52:39.004: ERROR/WindowManager(297): at dalvik.system.NativeStart.main(Native Method)

+0

它如何終止?產生一個錯誤?日誌是什麼樣的? –

回答

0

此統計你的線程:

new TheTask().execute(); 

不過,我不明白你爲什麼盯着新此外線程:

new Thread(new Runnable(){ 
      public void run(){   
       //Thread.sleep(5*1000); 
       ReadPhoneBook(); 
       pbarDialog.dismiss(); 
      }   
     }).start(); 

爲什麼不使用其中一種?

+0

對不起,我忘了發表評論,讓我更新它...即使在評論它,它不工作.. – Anup

+0

把TheTask類的ReadPhoneBook方法或添加'同步'到ReadPhoneBook方法簽名 – eggie5

+0

試了兩個)將ReadPhoneBook方法放在TheTAsk類中,並且b)將同步添加到ReadPhoneBook中,它仍然不工作... – Anup

0

修復了這個問題。試圖從線程更新主活動中的視圖。

相關問題