android मुख्य UI थ्रेड के बाहर प्रोग्राम कैसे करें




multithreading udp (3)

ui धागा मुख्य धागा है आप वर्तमान धागे के बारे में जानते हैं

Thread.currentThread().getName();

माफ़ कीजिए मैंने अपना पूरा सवाल नहीं पढ़ा है, लेकिन आपको मुख्य थ्रेड से दूसरे थ्रेड में प्रोसेस अवरुद्ध करना पड़ता है।

ऐसा करने के कई तरीके हैं: AsyncTask, सेवाएँ, निष्पादक सेवा और RxJava और जो चुनने के लिए आपकी आवश्यकता पर निर्भर करता है

यह लिंक उपयोगी होगा :)

मुझे नहीं पता कि एक UI थ्रेड डिफ़ॉल्ट रूप से मौजूद है, इसे कैसे बना सकता है यदि नहीं, या कैसे बताना जब मैं "इन" में हूँ जहां यह शुरू होता है और समाप्त होता है यदि ऐसा है मैं कैसे सुनिश्चित PacketListener कि PacketListener मुख्य UI थ्रेड का हिस्सा नहीं है?

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

मैंने सोचा था कि मेनएक्टिविटी वर्ग यूआई थ्रेड होगा, क्योंकि, ठीक है, मेरे पास एक यूआई था और यह काम करती थी। हालांकि, मैंने एक अलग वर्ग बनाया है जो रननाबल को लागू करता है, और इसमें नेटवर्क कनेक्शन सामान रखता है, और अब भी अपवाद प्राप्त कर रहा है, इसलिए यह अभी भी मुख्य धागा का हिस्सा है, हाँ? मैं देख सकता हूं कि मुख्य गतिविधि थ्रेड का विस्तार नहीं करती है, इसलिए शायद यह एक मूक धारणा थी। मुझे ऐसा महसूस नहीं होता है कि अगर मैं एक और वर्ग जोड़ूंगा जो रननाबल / थ्रेड का विस्तार करता है। यह होगा?

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ArrayList<String> listItems;
    ArrayAdapter<String> adapter;

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

        listItems = new ArrayList<>();
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
        ListView listview = (ListView) findViewById(R.id.listview);
        listview.setAdapter(adapter);

        (new Thread(new PacketListener(adapter))).run();
    }
}

PackageListener.java:

public class PacketListener implements Runnable {
    ArrayAdapter<String> adapter;

    public PacketListener(ArrayAdapter<String> adapter) {
        this.adapter = adapter;
    }

    public void run() {
        byte[] buf = new byte[256];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        try {
            DatagramSocket socket = new DatagramSocket();
            socket.receive(packet);
        }
        catch(Exception e) {
            adapter.add("Exception: " + e.toString() );
            e.printStackTrace();
        }
        catch(Error e) {
            adapter.add("Unspecified Error: " + e.toString() );
            e.printStackTrace();
        }
    }
}

संपादित करें:

इस पृष्ठ के उदाहरण का पालन ​​करने की कोशिश में मेरा नवीनतम प्रयास, मेरे अधिकांश प्रयासों का मार्ग चला गया है, और ऐप को पूरी तरह से तोड़ दिया है। SendAnother एक परीक्षण विधि है जो किसी बटन से जुड़ी होती है:

public void sendAnother(View view) {
    adapter.add("button clicked");

    new Thread(new Runnable() {
        public void run() {
            listview.post(new Runnable() {
                public void run() {
                    adapter.add("inside worker thread");
                }
            });
        }
    });
}

मुझे लगता है कि अगले समय मैं AsyncTask कोशिश AsyncTask । अगर अब यह "गंदे" है, तो अब मुझे बहुत परवाह नहीं है


आपकी पिछली विधि सही है, धागा को छोड़कर अभी तक शुरू नहीं हुआ है। तो आपको कॉल start() करने की आवश्यकता है start() :

public void sendAnother(View view) {
  //adapter.add("button clicked");

  new Thread(new Runnable() {
    public void run() {
      listview.post(new Runnable() {
        public void run() {
          adapter.add("inside worker thread");
        }
      });
    }
  }).start();
}

मुझे अभी भी यकीन नहीं है कि मुझे इस प्रोजेक्ट के लिए असिनक टास्क पसंद है, इसलिए यदि कोई हेन्डलर या रननाबल का उपयोग करने के लिए ट्यूटोरियल की सलाह या लिंक दे सकता है, तो इसे पोस्ट करें!

हालांकि कड़ाई से बोलते हुए, यह कम से कम अंत में मुझे UI थ्रेड के बाहर सामान करने देता है, और यही सवाल था। सूयू, इस समस्या के किसी भी अन्य के लिए इसके लायक क्या है, यह मेरे लिए पहली बार काम करने वाला है।

public class MainActivity extends AppCompatActivity {
    ArrayAdapter<String> adapter;
    private static final int PORT= 8888;
    private static final int TIMEOUT_MS = 500;

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

        ArrayList<String> listItems = new ArrayList<>();
        ListView listview = (ListView) findViewById(R.id.lvMain);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listItems);
        listview.setAdapter(adapter);

        UpdateView task = new UpdateView();
        task.execute();

        //just to show these parts are in different threads
        String temp = Thread.currentThread().getName();
        adapter.add("onCreate: " + temp);
    }

    private class UpdateView extends AsyncTask<URL, Integer, Long> {
        protected Long doInBackground(URL... urls) {
            //just to show these parts are in different threads
            String temp = Thread.currentThread().getName();
            adapter.add("UpdateView: " + temp);

            byte[] buf = new byte[256];
            byte[] ipAddress = {(byte)192,(byte)168,0,1};

            try {
                InetAddress address = InetAddress.getByAddress(ipAddress);

                String message = "\"xyz\"";
                DatagramSocket socket = new DatagramSocket(PORT);
                DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), address, PORT);
                socket.send(packet);

                packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
            }
            catch(IOException e) {
                adapter.add("IO Exception: " + e.toString() );
                e.printStackTrace();
            }

            adapter.notifyDataSetChanged();
            return 0L;
        }
    }
}




networkonmainthread