2011-06-03 23 views
8

में कुछ एंड्रॉइड यूआई सामान करें क्या गैर-यूआई थ्रेड में यूआई परिवर्तन करने का कोई तरीका है? संक्षिप्त सवालगैर-यूआई थ्रेड

उत्तर

5

आप एक AsyncTask उपयोग करने के लिए, अपने मुख्य गतिविधि में एक आंतरिक वर्ग (ResponseHandler) के साथ पर्यवेक्षक पैटर्न की कोशिश चाहते हैं न, तो माफ करना मैं स्वरूपण सही लेकिन यकीन है कि आप विचार प्राप्त im सके

public class WorkerThread extends Observable implements Runnable { 
public void run() { 
    try { 
      DoSomething(); 
      String response = "Doing something"; 
      setChanged(); 
      notifyObservers(response); 
      DoSomethingElse(); 
      String response = "Doing something else"; 
      setChanged(); 
      notifyObservers(response); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
private void DoSomething(){ 
} 
private void DoSomethingElse(){ 
} 


public class MainActivity{ 
public class ResponseHandler implements Observer { 
    private String resp; 
    public void update (Observable obj, Object arg) { 
     if (arg instanceof String) { 
      resp = (String) arg; 
      //Write message to UI here ie System.out.println("\nReceived Response: "+ resp); 
      //or EditText et = (EditText)findViewById(R.id.blah); 
      // blah.SetText(resp); 
     } 
    } 
} 
private void doStuffAndReportToUI(){ 
    final WorkerThread wt = new WorkerThread(); 
    final ResponseHandler respHandler = new ResponseHandler(); 
    wt.addObserver(respHandler); 
    Thread thread = new Thread(wt); 
    thread.start(); 
} 
5

ऐसा करने के कई तरीके हैं, AsyncTask or Threads का उपयोग करें। संक्षिप्त जवाब।

सुझाव: यूआई सामान पूर्व postExecute/runOnUiThread/हैंडलर वर्ग

1

Handler वर्ग चेक बाहर किया जा सकता है। या इन इसी तरह के सवाल पर एक नज़र डालें:

Update UI from Thread

Handling UI code from a Thread

updating the ui from thread using audiotrack

+0

अच्छी तरह से मूल समस्या यह है कि, धागा मेरी मुख्य गतिविधि की तुलना में अन्य वर्ग में है, और यह अनंत लूप (सॉकेट इत्यादि) में कुछ कर रहा है। – Knobik

9

या तो Handler का उपयोग करें या नीचे दिए गए कोड का उपयोग

runOnUiThread(new Runnable() 
    {   
     @Override 
     public void run() 
     { 
      // Ui Stuff here     
     } 
    }); 
0

मैं + tmho जवाब की कोशिश की, लेकिन यह अभी भी इस त्रुटि देता है:

E/AndroidRuntime(****): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

मैं अंत में + ingsaurabh तरीके के साथ यह combinning खत्म, उस तरह:

private class ResponseHandler implements Observer, Runnable { 

    Activity act; 

    public ResponseHandler(Activity caller) { 
     act = caller; 
    } 

    @Override 
    public void update (Observable obj, Object arg) { 
     act.runOnUiThread(this); 
    } 

    @Override 
    public void run() { 
     //update UI here 
    } 
} 

आप दोनों को धन्यवाद।

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