Intereting Posts
एंड्रॉइड के लिए मैं एपीआई डॉक्स डाउनलोड कर सकता हूं? एंड्रॉइड डाटा बाइंडिंग और एमवीवीएम – समान दृश्य मॉडल का उपयोग करके विभिन्न स्थितियों के लिए उसी लेआउट फाइल का उपयोग करना एंड्रॉइड में कस्टम बटन में तीन बटन को क्लिक करें अपने स्वयं के धागे में वेब अनुरोध कैसे निष्पादित करें? कॉर्डोवा-प्लगइन-मीडिया: पार्स ".AMR" नोडजेएस सर्वर पर ऑडियो फ़ाइल com.android.support: customtabs: कोई आभासी विधि लांच नहीं url एंड्रॉइड ऐप के नाम से शेल कमांड चलाने के लिए कैसे करें (रूटेड) एंड्रॉइड पैकेज आयात करना हल नहीं किया जा सकता स्क्रीन पर एक अन्य बिंदु पर एक बटन को ले जाने की कोशिश कर रहा है एंड्रॉइड: डेट पिक्चर गतिविधि के अंदर काम नहीं कर रहा है WebView में YouTube वीडियो लोड करते समय पूर्ण स्क्रीन विकल्प उपलब्ध नहीं है एंड्रॉइड – वेबदृश्य प्रोग्रेसबार वैश्विक चर के लिए आवेदन वर्ग का उपयोग करें एंड्रॉइड, एक्लिप्स, रखो "जेब" और "पथ बनाने के लिए जोड़ें" बनाम "।" ड्रॉवर लेआउट का आइटम क्लिक – टुकड़ा को बदलने का सही समय कब है?

doInBackground में किसी फ़ंक्शन के अंदर से प्रगति करें?

मैं एक लंबी प्रक्रिया करने के लिए एक AsyncTask का उपयोग करें।

मैं अपने लंबे प्रोसेस कोड सीधे doInBackground में जगह नहीं करना चाहता इसके बजाय मेरी लंबी प्रक्रिया कोड दूसरे वर्ग में स्थित है, जो कि मैं doInBackground में कॉल करता हूं

मैं लंबे समय से प्रसंस्करण समारोह के अंदर से प्रगति को कॉल करने में सक्षम होना चाहता हूं। सी ++ में मैं कॉलबैक पॉइंटर को प्रकाशित करने के लिए पास कर दूँगा।

मैं जावा में ऐसा कैसे करूँ?

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

मेरी लंबी प्रक्रिया कोड:

public class MyLongProcessClass { public static void mylongProcess(File filetoRead) { // some code... // here I would like to call publishProgress // some code... } } 

मेरा AsyncTask कोड:

 private class ReadFileTask extends AsyncTask<File, Void, Boolean> { ProgressDialog taskProgress; @Override protected Boolean doInBackground(File... configFile) { MyLongProcessClass.mylongProcess(configFile[0]); return true; } } 

# 2 संपादित करें लंबी प्रक्रिया विधि भी गैर-स्थिर हो सकती है और इस तरह से बुलाया जा सकता है:

 MyLongProcessClass fileReader = new MyLongProcessClass(); fileReader.mylongProcess(configFile[0]); 

लेकिन यह मेरी समस्या को परिवर्तित नहीं करता है

Solutions Collecting From Web of "doInBackground में किसी फ़ंक्शन के अंदर से प्रगति करें?"

कठिनाई है कि publishProgress को protected final से protected final जाता protected final भले ही आप this अपने static विधि कॉल में पास करते हैं, तो आप अभी भी publishProgress सीधे कॉल नहीं कर सकते

मैंने यह स्वयं की कोशिश नहीं की है, लेकिन इसके बारे में:

 public class LongOperation extends AsyncTask<String, Integer, String> { ... @Override protected String doInBackground(String... params) { SomeClass.doStuff(this); return null; } ... public void doProgress(int value){ publishProgress(value); } } ... public class SomeClass { public static void doStuff(LongOperation task){ // do stuff task.doProgress(1); // more stuff etc } } 

यदि यह काम करता है तो कृपया मुझे बताएं! ध्यान दें कि doProgress से लागू की गई किसी विधि के अलावा कहीं भी doProgress को कॉल doProgress से लगभग निश्चित रूप से त्रुटि उत्पन्न होगी

मुझे बहुत गंदे लगता है, किसी और के पास बेहतर तरीका है?

एक समाधान AsyncTask के अंदर एक साधारण public वर्ग को रख सकता है (सुनिश्चित करें कि आप जिस कार्य को परिभाषित करते हैं वह भी public ) जिसमें एक public विधि है जिसे publishProgress(val) । उस कक्षा को पास करना किसी अन्य पैकेज या कक्षा से उपलब्ध होना चाहिए।

 public abstract class MyClass { public MyClass() { // code... } // more code from your class... public class Task extends AsyncTask<String, Integer, Integer> { private Progress progress; protected Task() { this.progress = new Progress(this); } // ... @Override protected Integer doInBackground(String... params) { // ... SomeClass.doStuff(progress); // ... } // ... @Override protected void onProgressUpdate(Integer... progress) { // your code to update progress } public class Progress { private Task task; public Progress(Task task) { this.task = task; } public void publish(int val) { task.publishProgress(val); } } } } 

और फिर दूसरे वर्ग में:

 public class SomeClass { public static void doStuff(Progress progress){ // do stuff progress.publish(20); // more stuff etc } } 

यह मेरे लिए काम किया

छोटे कार्यों में longProcess() फ़ंक्शन को विभाजित करें

नमूना कोड:

 @Override protected Boolean doInBackground(Void... params) { YourClass.yourStaticMethodOne(); publishProgress(1); YourClass.yourStaticMethodTwo(); publishProgress(2); YourClass.yourStaticMethodThree(); publishProgress(3); // And so on... return true; } 

यदि यह काम करता है तो कृपया मुझे बताएं! ध्यान दें कि doInBackground से लागू की गई किसी विधि के अलावा कहीं भी doProgress को कॉल करने से लगभग निश्चित रूप से त्रुटि उत्पन्न होगी

हाँ यह काम करता है। मैंने इसे बढ़ा दिया है ताकि आपको अपने विधि में पैरामीटर के रूप में AsyncTask को पास करने की आवश्यकता न हो। यह विशेष रूप से उपयोगी है यदि (जैसे मेरी) आप पहले से ही तय कर चुके हैं कि वास्तव में आपको कुछ प्रगति प्रकाशित करने की ज़रूरत है, या मेरे मामले में, एक AsyncTask से यूआई अपडेट करें:

 public abstract class ModifiedAsyncTask<A,B,C> extends AsyncTask<A,B,C>{ private static final HashMap<Thread,ModifiedAsyncTask<?,?,?>> threads = new HashMap<Thread,ModifiedAsyncTask<?,?,?>>(); @Override protected C doInBackground(A... params) { threads.put(Thread.currentThread(), this); return null; } public static <T> void publishProgressCustom(T... t) throws ClassCastException{ ModifiedAsyncTask<?, T, ?> task = null; try{ task = (ModifiedAsyncTask<?, T, ?>) threads.get(Thread.currentThread()); }catch(ClassCastException e){ throw e; } if(task!=null) task.publishProgress(t); } } public class testThreadsActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void Button1Clicked(View v){ MyThread mthread = new MyThread(); mthread.execute((Void[])null); } private class MyThread extends ModifiedAsyncTask<Void, Long, Void>{ @Override protected Void doInBackground(Void... params) { super.doInBackground(params); while(true){ myMethod(System.currentTimeMillis()); try { Thread.sleep(1000L); } catch (InterruptedException e) { return null; } } } protected void onProgressUpdate(Long... progress) { //Update UI ((TextView) findViewById(R.id.textView2)).setText("The Time is:" + progress[0]); } } private void myMethod(long l){ // do something // request UI update ModifiedAsyncTask.publishProgressCustom(new Long[]{l}); } } 

मुझे बहुत गंदे लगता है, किसी और के पास बेहतर तरीका है?

मेरा रास्ता शायद बदतर है मैं doProgress (जिसे मैं publishProgressCustom कहा जाता है) के लिए एक स्थिर विधि कह रहा हूँ इसे बिना किसी त्रुटि के उत्पादन के कहीं से भी कहा जा सकता है (जैसे कि धागा के पास हैशैम में कोई संबंधित असिनक टास्क नहीं है, यह प्रकाशित नहीं करेगा प्रगति)। नीचे की ओर यह है कि थ्रेड शुरू होने के बाद आपको थ्रेड-एसिंक टास्क मानचित्रण करना होगा। (आप दुख की बात के रूप में AsyncTask.execute () ओवरराइड नहीं कर सकते क्योंकि यह अंतिम है)। मैंने इसे सुपर वर्ड में आईनबैकग्राउंड () को ओवरराइड करके किया है, जिससे कि किसी को भी इसे बढ़ाया जाए, केवल super.doInBackground () को अपने स्वयं के doInBackground () में पहली पंक्ति के रूप में रखना होगा।

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

जब आप कहते हैं कि " मेरी लंबी प्रक्रिया कोड दूसरे वर्ग में स्थित है जो मैं doInBackground में कॉल करता हूं ", क्या आपका मतलब है " किसी अन्य विधि में स्थित है जिसे मैं doInBackground में कॉल करता हूं "?

यदि हां, तो आप उस विधि को अपने ऐशिनटस्क क्लास की एक निजी विधि बना सकते हैं। फिर आप जब भी आवश्यक हो, तो विधि के भीतर प्रकाशन को प्रगट कर सकते हैं।