2013-03-31 80 views
-1

我想製作一個android應用程序,它將完成啓動,然後運行一個while循環,直到用戶完成特定任務。然後代碼將運行另一個函數以確保用戶已正確完成任務。我應該如何去做這件事。我已經嘗試將on循環放入onCreate,onStart和onResume中,並在所有while循環中永久運行而不讓GUI被繪製,因此使得任務無法完成(有時我還會得到ANR消息)。我應該在哪裏放置while循環,以便在該活動開始後立即運行並且不會干擾啓動?運行暫時循環Android代碼

感謝,

andrewgies17

編輯13年3月31日2:45 PST:

所以我把RyPope的意見,並創建了一個新的線程,並且我打電話主線程功能它不喜歡那樣。這裏是我的所有代碼:

` 公共類MainActivity擴展活動{

public EditText pass1, pass2, pass3, pass4; 
public int current = 1; 
public boolean enteringCode = true; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    pass1 = (EditText) findViewById(R.id.pass1); 
    pass2 = (EditText) findViewById(R.id.pass2); 
    pass3 = (EditText) findViewById(R.id.pass3); 
    pass4 = (EditText) findViewById(R.id.pass4); 

    new Thread(new Runnable() { 
     public void run() { 
      checkInputs(); 
     } 
    }).start(); 
} 

public void checkInputs() { 
    while(enteringCode) { 
     if(pass1.getText().toString().length() > 0) { 
      current = 2; 
     } 
     if(pass2.getText().toString().length() > 0) { 
      current = 3; 
     } 
     if(pass3.getText().toString().length() > 0) { 
      current = 4; 
     } 
     if(pass4.getText().toString().length() > 0) { 
      enteringCode = false; 
      System.out.println(Integer.parseInt(pass1.getText().toString() + pass2.getText().toString() + pass3.getText().toString() + pass4.getText().toString())); 
      authenticateCode(Integer.parseInt(pass1.getText().toString() + pass2.getText().toString() + pass3.getText().toString() + pass4.getText().toString())); 
     } 
     if(current == 1) { 
      pass1.requestFocus(); 
     } 
     if(current == 2) { 
      pass2.requestFocus(); 
     } 
     if(current == 3) { 
      pass3.requestFocus(); 
     } 
     if(current == 4) { 
      pass4.requestFocus(); 
     } 
    } 
} 

public void authenticateCode(int code) { 

} 

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

} ` 所以,當這個運行和視圖試圖要求重點崩潰,我得到以下logcat的輸出:

03-31 14:46:54.803: E/AndroidRuntime(10922): FATAL EXCEPTION: Thread-4197 03-31 14:46:54.803: E/AndroidRuntime(10922): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4062) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:730) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:779) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4005) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.invalidate(View.java:8605) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.onFocusChanged(View.java:3884) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.widget.TextView.onFocusChanged(TextView.java:8281) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.unFocus(View.java:3814) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:530) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.handleFocusGainInternal(View.java:3706) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5402) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5352) 03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5330) 03-31 14:46:54.803: E/AndroidRuntime(10922): at com.thirteenbit.driveSafe.MainActivity.checkInputs(MainActivity.java:51) 03-31 14:46:54.803: E/AndroidRuntime(10922): at com.thirteenbit.driveSafe.MainActivity$1.run(MainActivity.java:26) 03-31 14:46:54.803: E/AndroidRuntime(10922): at java.lang.Thread.run(Thread.java:856)

任何人有解決這種困境?

+0

'onCreate()'可能沒問題,但我們必須查看代碼才能知道問題所在。另外,logcat如果崩潰。如果它是網絡的東西,那麼它將需要在後臺線程 – codeMagic

回答

0

可能最好創建一個新的thread,以便啓動不會掛在循環上。在OnCreate 試試這個:

new Thread(new Runnable() { 
    public void run() { 
     while(true) 
     { 

     } 
    } 
}).start(); 
+0

完成,所以這將允許我的操作在後臺運行,而啓動運行?另外,當我完成它時,我將如何結束這一步? –

+0

好吧,我試過了,現在它啓動了,但是當用戶完成活動時,它被編程爲將另一個視圖放到焦點上,當發生這種情況時,它崩潰並且logcat說只有原始線程可以觸摸它的視圖。 –

+0

你不能在mainActivity中調用一個函數並在原始線程上執行操作?嘗試使用 thread.shouldContinue = false; 線程。加入(); – RyPope

0

我覺得你的概念是有缺陷的。你可能並不是真的想要一個循環來運行。您希望在用戶完成任務後發生某些事情。您應該使用在用戶完成任務後激活的偵聽器。

+0

http://stackoverflow.com/q/36658713/5144855 –

0

當你想在循環中運行,你必須在新的線程中運行它,因爲這樣做對主(UI)線程時,那麼你的應用程序不能更新UI的一些代碼,因爲主線程所使用的是所有的時間。因此,儘量做出新的threadtimer(這是更好)。

我希望這對你有幫助。