[Android] थ्रेड का उपयोग करके एंड्रॉइड UI अपडेट करना


Answers

आप गैर- UI थ्रेड से UI तत्वों को नहीं बदल सकते। RunOnUiThread का उपयोग करने का प्रयास करें

runOnUiThread(new Runnable(){
    @Override
    public void run(){
        // change UI elements here
    }
});
Question

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

private class chatReceiver implements Runnable {
    @Override
    public void run() {
        try {
            skt = new DatagramSocket(Integer.parseInt(Main.prefs.getString("port_number", "5432")));
            DatagramPacket rcvPkt = new DatagramPacket(rcvBuf,rcvBuf.length);
            String ack = "Hello from our SimpleUDPServer";
            byte[] sndBuf = ack.getBytes();
            while (true) {
                Log.d("Server received: " ,"entered loop");
                skt.receive(rcvPkt);
                String rcvMsg = new String(rcvBuf, 0, rcvPkt.getLength(), "UTF-8");
                Log.d("Server received: " ,"receiving" + rcvMsg);
                if (rcvMsg != null) {
                    Log.d("Server received: " ,"not equal null");
                    // I want to update my UI here
                }
                DatagramPacket k = new DatagramPacket(sndBuf, sndBuf.length,
                        rcvPkt.getAddress(), rcvPkt.getPort());
                skt.send(k);
                Log.d("Server sent" ,ack);

            }
        } catch (IOException ex) {
            Log.d("ThreadStart", "Error Starting thread" + ex.getStackTrace());
        }

    }
} 

और UI का उपयोग करने के लिए मैं इसका उपयोग करता हूं:

public static void updateUI(Bubble b, View itemView) {

    TextView txt_display_name = (TextView) itemView
            .findViewById(R.id.display_name);
    txt_display_name.setText(b.getDisplay_name());
    TextView txt_chat_body = (TextView) itemView
            .findViewById(R.id.chat_body);
    txt_chat_body.setText(b.getChat_body());
    TextView txt_creation_date = (TextView) itemView
            .findViewById(R.id.creation_date);
    txt_creation_date.setText(b.getCreation_time());
}

मेरा ऐप दुर्घटनाग्रस्त होने पर रहता है !!




वर्दी थ्रेड से अपना यूजर अपडेट करने के लिए इस पद्धति का उपयोग करें , यहां बहुत अच्छी तरह से समझाया गया है।

** नोट - यदि आप progressBar.setProgress (प्रगति) का उपयोग कर रहे हैं तो आप सीधे वर्कर थ्रेड से अपडेट कर सकते हैं, क्योंकि प्रगतिबार आंतरिक रूप से कॉल करने के लिए प्रगति () विधि हैंडलर का इस्तेमाल करते हैं। **