2011-03-20 18 views
6

को अपडेट करेगा, असल में, मैं एक सेकंड काउंटर और लेवल काउंटर चलाने की कोशिश कर रहा हूं। हर 10 सेकंड के लिए मैं ++ स्तर चाहता हूं।
लेकिन अभी तक इसे लागू नहीं किया गया है, अभी तक मैं केवल सेकंड प्रदर्शित करने की कोशिश कर रहा हूं लेकिन मुझे रनटाइम अपवाद और क्रैश मिल रहा है।
गुगलिंग मैं इसे देखता हूं क्योंकि ऐसा इसलिए है कि मैं अपने धागे से यूआई को अपडेट करने की कोशिश कर रहा हूं और इसकी अनुमति नहीं है। तो मुझे लगता है कि मुझे asyncTask की आवश्यकता होगी, लेकिन मुझे नहीं पता कि मेरे सरल छोटे कार्यक्रम के साथ ऐसा कैसे किया जाए। मदद या मुझे कुछ विकल्प दे ...एंड्रॉइड, एक साधारण धागा बना रहा है जो मेरे सेकंड

package com.ryan1; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class main extends Activity { 

int level = 1; 
int seconds_running=0; 

TextView the_seconds; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    the_seconds = (TextView) findViewById(R.id.textview_seconds); 



    Thread thread1 = new Thread(){ 
     public void run(){ 
      try { 
       sleep(1000); Log.d("RYAN", " RYAN "); 

       updated_secs(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("RYAN", " "+e); 
      } 
     } 
    }; 
    thread1.start(); 
} 

public void updated_secs(){ 
    seconds_running++; 
    the_seconds.setText(" "+seconds_running); 
} 
} 

उत्तर

6

अपने यूआई थ्रेड में हैंडलर बनाएं, फिर कार्यकर्ता थ्रेड में हैंडलर (हैंडलर.sendMessage (...)) को एक संदेश भेजें।

संदेश आपके यूआई थ्रेड पर संसाधित किया जाएगा, ताकि आप टेक्स्ट विजेट को सही तरीके से अपडेट कर सकें। इस तरह:

private Handler myUIHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if (msg.what == some_id_you_created) 
     { 
      //Update UI here... 
     } 
    } 
}; 

Then in your thread, to send a message to the handler you do this: 

Message theMessage = myHandler.obtainMessage(some_id_you_created); 
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler. 
+0

हे! हम एक ही नाम साझा करते हैं :) क्या आप मुझे कुछ नमूना कोड दे सकते हैं? इस पर घंटों के बाद मुझे बहुत मस्तिष्क मृत महसूस हो रहा है ... – Ryan

+0

धन्यवाद! कोशिश करूँगा! – Ryan

1

AsyncTask और postDelayed विधि के साथ एक हैंडलर का उपयोग करके बनाया एक टाइमर का एक बड़ा example नहीं है।

आप सही हैं कि पृष्ठभूमि से यूआई को अपडेट करना नो-नो है।

+0

उत्तर देने के लिए धन्यवाद! मैंने वास्तव में यह देखा, लेकिन मैं धागे के माध्यम से ऐसा करना चाहता हूं क्योंकि मैं धागे सीखना चाहता हूं क्योंकि मैंने पाठकों के साथ जाने के बाद यह काफी महत्वपूर्ण सुना है और आखिरकार एक खेल बनाने के लिए आ गया है ... क्या आप मेरी मदद कर सकते हैं कृपया धागे के माध्यम से? – Ryan

+0

मुझे एसिंक टास्क कार्य का उपयोग भी नहीं किया जा रहा है –

3

इस तरह की बात के लिए, यह एक और थ्रेड का उपयोग करने के लिए अपशिष्ट है; यह सिर्फ एक अपशिष्ट है और इसे बनाता है ताकि आपको बहुभाषी मुद्दों के साथ डेल करना पड़े। इसके बजाय, बस Handler.sendDelayedMessage() का उपयोग करें:

static final int MSG_DO_IT = 1; 
static final long TIME_BETWEEN_MESSAGES = 10 * 1000; // 10 seconds 

Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_DO_IT: { 

       // Update your UI here... 

       Message newMsg = obtainMessage(MSG_DO_IT); 
       sendMessageDelayed(newMsg, TIME_BETWEEN_MESSAGES); 
      } break; 
     } 
    } 
} 

@Override 
void onResume() { 
    super.onResume(); 

    // Start the timer, executing first event immediately. 
    Message newMsg = mHandler.obtainMessage(MSG_DO_IT); 
    mHandler.sendMessage(newMsg); 
} 

@Override 
void onPause() { 
    super.onPause(); 

    // Stop the timer. 
    mHandler.removeMessages(MSG_DO_IT); 
} 

ध्यान दें कि यह कार्यान्वयन कुछ बहाव होगा - संदेशों के बीच वास्तविक समय TIME_BETWEEN_MESSAGES + (समय संदेश प्रेषण करने के लिए) है। यदि आपको कुछ ऐसी चीज चाहिए जो बहाव नहीं करेगी, तो आप Hander.sendMessageAtTime() का उपयोग कर अपने आप को समय-समय पर निरंतर मूल्य के साथ नए समय में वृद्धि कर सकते हैं, प्रारंभिक समय से आप सिस्टमक्लॉक.अपटाइममिलिस() के साथ प्राप्त करते हैं।()।

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