2013-02-20 11 views
20

मैं केवल अभी शुरुआत तो मेरे संभवतः एक बेवकूफ सवालकेवल मूल धागा जिसने दृश्य पदानुक्रम बनाया है, उसके विचारों को छू सकता है। Android पर


मैं केवल मूल बात यह है कि एक दृश्य पदानुक्रम बनाया अपने विचार छू सकता है का मतलब समझ में नहीं आता पूछने के लिए माफ कर दें।

कृपया कोई मुझे सिखा सकता है कि यह त्रुटि क्यों हो रही है और इस समस्या को हल करने के लिए कैसे।

ThankYou

यह मेरी कक्षा

public class MainActivity extends Activity { 
    TextView title; 
    Random random = new Random(); 
    int  counter = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.startup); 
     startingUp(); 
    } 

    private void startingUp() { 
     Thread timer = new Thread() { //new thread   
      public void run() { 
       Boolean b = true; 
       try { 
        do { 
         counter++; 
         title(); 
         sleep(1000); 
         title.clearComposingText(); 

        } 
        while (b == true); 
       } catch (IntruptedException e) { 
        e.printStackTrace(); 
       } 
       finally { 
       } 
      }; 
     }; 
     timer.start(); 
    } 

    public void title() { 
     title = (TextView) findViewById(R.id.tvTitle); 
     switch (random.nextInt(2)) { 
      case 0: 
       title.setGravity(Gravity.RIGHT); 
       break; 
      case 1: 
       title.setGravity(Gravity.CENTER); 
       break; 
      case 2: 
       title.setGravity(Gravity.LEFT); 
       break; 
     } 
     title.setTextColor(Color.rgb(random.nextInt(250), random.nextInt(250), random.nextInt(250))); 
     title.setTextSize(random.nextInt(55) + 10); 
    } 
} 

है और ये मेरे LogCat

02-20 10:53:19.293: I/Adreno200-EGLSUB(5816): <ConfigWindowMatch:2078>: Format RGBA_8888. 
02-20 10:53:19.303: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5c914000 size:14135296 offset:10366976 fd:64 
02-20 10:53:19.303: E/(5816): Can't open file for reading 
02-20 10:53:19.303: E/(5816): Can't open file for reading 
02-20 10:53:19.303: D/OpenGLRenderer(5816): Enabling debug mode 0 
02-20 10:53:19.373: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5db58000 size:3768320 offset:0 fd:67 
02-20 10:53:20.143: W/dalvikvm(5816): threadid=11: thread exiting with uncaught exception (group=0x40abc210) 
02-20 10:53:20.143: E/AndroidRuntime(5816): FATAL EXCEPTION: Thread-3102 
02-20 10:53:20.143: E/AndroidRuntime(5816): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4112) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.View.invalidate(View.java:8639) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.View.invalidate(View.java:8590) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.widget.TextView.setGravity(TextView.java:2538) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at com.example.saikoro.MainActivity.title(MainActivity.java:58) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at com.example.saikoro.MainActivity$1.run(MainActivity.java:36) 
+4

मैं तुम्हें यहाँ यूआई धागा की अवधारणा सीखने की जरूरत है लगता है। http://developer.android.com/guide/components/processes-and-threads.html – Rajnikant

+0

धन्यवाद लेकिन इस समस्या को हल करने के लिए मुझे क्या करने की आवश्यकता है? –

+1

मुझे खेद है कि मैंने कल केवल स्टैक ओवरफ्लो का उपयोग शुरू किया था, इसलिए मुझे नहीं पता कि –

उत्तर

27

बदलें।

private void startingUp() { 
    Thread timer = new Thread() { //new thread   
     public void run() { 
      Boolean b = true; 
      try { 
       do { 
        counter++; 
        title(); 
        sleep(1000); 

        runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 

         title.clearComposingText(); 
        } 
       }); 


       } 
       while (b == true); 
      } catch (IntruptedException e) { 
       e.printStackTrace(); 
      } 
      finally { 
      } 
     }; 
    }; 
    timer.start(); 
} 

आप गैर यूआई धागे से विचारों को संशोधित नहीं कर सकते हैं।

2

है आप क्योंकि आप केवल विचारों को संशोधित कर सकते धागा अंदर title.clearComposingText(); के साथ पाठ संशोधित नहीं कर सकते यूआई थ्रेड से। इसके बजाय एक हैंडलर का प्रयोग करें और उसे टेक्स्ट को बदलने दें।

2

आप यूआई thread.You के अलावा अन्य धागे से TextView अद्यतन नहीं चाहिए this.Can के लिए asynctask उपयोग कर सकते हैं अपने startingUp() इस का उल्लेख this

2

जैसा कि अन्य लोगों ने पहले ही कहा है, आप पृष्ठभूमि थ्रेड से UI को संशोधित नहीं कर सकते हैं।

आप AsyncTask उपयोग करें, या Activity.runOnUiThread() विधि

11

यह अपवाद नहीं हो रही है की वजह से title.clearComposingText() उपयोग कर सकते हैं। यहां तक ​​कि यह लाइन उपयोगी नहीं है, हम इस लाइन को हटा सकते हैं। यह अपवाद शीर्षक() फ़ंक्शन में आ रहा है क्योंकि एक गैर UI-Thread दृश्य को संशोधित करने का प्रयास कर रहा है। इसलिए हमें इस फ़ंक्शन को UI थ्रेड या हैंडलर में कॉल करने की आवश्यकता है।

private void startingUp() { 
     Thread timer = new Thread() { //new thread   
      public void run() { 
       boolean b = true; 
       try { 
        do { 
         counter++; 

         sleep(1000); 
         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
            title(); 
           //title.clearComposingText();//not useful 

          } 
         }); 


        } 
        while (b == true); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       finally { 
       } 
      }; 
     }; 
     timer.start(); 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे