ඇන්ඩ්‍රොයිඩ් සමඟ ගොනුවක් බාගන්න, සහ ප්‍රගති සංවාදයක ප්‍රගතිය පෙන්වයි


1057

යාවත්කාලීන වන සරල යෙදුමක් ලිවීමට මම උත්සාහ කරමි. මේ සඳහා මට ගොනුවක් බාගත කර සරල ප්‍රගතියක් අවශ්‍ය වේ ProgressDialog. එය කරන්නේ කෙසේදැයි මම දනිමි ProgressDialog, නමුත් වර්තමාන ප්‍රගතිය පෙන්වන්නේ කෙසේද සහ ගොනුව මුලින්ම බාගත කරන්නේ කෙසේදැයි මට විශ්වාස නැත.


2
පහත සබැඳිය ඔබට උදව් වනු ඇතැයි මම බලාපොරොත්තු වෙමි ... androidhive.info/2012/04/…
ගනේෂ් කටිකාර්

1
ඉක්මන් විසඳුමක් සඳහා මෙම පිළිතුර බලන්න
රිචා

stackoverflow.com/a/43069239/3879214 මෙම පිළිතුර පරීක්ෂා කරන්න
අනු මාටින්

Answers:


1889

ලිපිගොනු බාගත කිරීමට බොහෝ ක්‍රම තිබේ. පහත දැක්වෙන්නේ මම වඩාත් පොදු ක්‍රම පළ කරමි. ඔබගේ යෙදුමට වඩා හොඳ කුමන ක්‍රමයද යන්න තීරණය කිරීම ඔබ සතුය.

1. AsyncTaskසංවාදයක බාගත කිරීමේ ප්‍රගතිය භාවිතා කර පෙන්වන්න

මෙම ක්‍රමය මඟින් ඔබට පසුබිම් ක්‍රියාවලි කිහිපයක් ක්‍රියාත්මක කිරීමට සහ එකවර UI යාවත්කාලීන කිරීමට ඉඩ ලබා දේ (මේ අවස්ථාවේ දී, අපි ප්‍රගති තීරුවක් යාවත්කාලීන කරන්නෙමු).

ආනයන:

import android.os.PowerManager;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;

මෙය උදාහරණ කේතයකි:

// declare the dialog as a member field of your activity
ProgressDialog mProgressDialog;

// instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);

// execute this when the downloader must be fired
final DownloadTask downloadTask = new DownloadTask(YourActivity.this);
downloadTask.execute("the url to the file you want to download");

mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {

    @Override
    public void onCancel(DialogInterface dialog) {
        downloadTask.cancel(true); //cancel the task
    }
});

AsyncTaskකැමැත්ත මේ ආකාරයට වනු ඇත:

// usually, subclasses of AsyncTask are declared inside the activity class.
// that way, you can easily modify the UI thread from here
private class DownloadTask extends AsyncTask<String, Integer, String> {

    private Context context;
    private PowerManager.WakeLock mWakeLock;

    public DownloadTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream("/sdcard/file_name.extension");

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }

ඉහත ක්‍රමය ( doInBackground) සෑම විටම පසුබිම් නූල් මත ක්‍රියාත්මක වේ. ඔබ එහි කිසිදු UI කාර්යයන් නොකළ යුතුය. අනෙක් අතට, දonProgressUpdate සහ onPreExecuteඑම UI නූල් මත ලකුණු, ඒ නිසා එහි ඔබ ප්රගතිය බාර් වෙනස් කළ හැකිය:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user 
        // presses the power button during download
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
             getClass().getName());
        mWakeLock.acquire();
        mProgressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        mWakeLock.release();
        mProgressDialog.dismiss();
        if (result != null)
            Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
    }

මෙය ක්‍රියාත්මක වීමට ඔබට WAKE_LOCK අවසරය අවශ්‍ය වේ.

<uses-permission android:name="android.permission.WAKE_LOCK" />

2. සේවාවෙන් බාගත කරන්න

මෙහි ඇති විශාලතම ප්‍රශ්නය නම්: සේවාවෙන් මගේ ක්‍රියාකාරකම් යාවත්කාලීන කරන්නේ කෙසේද? . ඊළඟ උදාහරණයේ දී ඔබ නොදන්නා පන්ති දෙකක් අපි භාවිතා කරන්නෙමු: ResultReceiverසහ IntentService. ResultReceiverසේවාවකින් අපගේ නූල් යාවත්කාලීන කිරීමට අපට ඉඩ සලසන එකකි; එහි සිට පසුබිම් වැඩ කිරීම සඳහා නූල් පොතක් IntentServiceඋප Serviceකුලකයක් වේ (ඔබ දැනගත යුතුය aService ඇත්ත වශයෙන්ම ඔබේ යෙදුමේ එකම ත්‍රෙඩ් ධාවනය වන ; ඔබ දිගු කරන විට Service, CPU අවහිර කිරීමේ මෙහෙයුම් ක්‍රියාත්මක කිරීම සඳහා ඔබ අතින් අතින් අතින් විහිදිය යුතුය).

බාගැනීමේ සේවාව මේ වගේ විය හැකිය:

public class DownloadService extends IntentService {
    public static final int UPDATE_PROGRESS = 8344;

    public DownloadService() {
        super("DownloadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {

        String urlToDownload = intent.getStringExtra("url");
        ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
        try {

            //create url and connect
            URL url = new URL(urlToDownload);
            URLConnection connection = url.openConnection();
            connection.connect();

            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();

            // download the file
            InputStream input = new BufferedInputStream(connection.getInputStream());

            String path = "/sdcard/BarcodeScanner-debug.apk" ;
            OutputStream output = new FileOutputStream(path);

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;

                // publishing the progress....
                Bundle resultData = new Bundle();
                resultData.putInt("progress" ,(int) (total * 100 / fileLength));
                receiver.send(UPDATE_PROGRESS, resultData);
                output.write(data, 0, count);
            }

            // close streams 
            output.flush();
            output.close();
            input.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        Bundle resultData = new Bundle();
        resultData.putInt("progress" ,100);

        receiver.send(UPDATE_PROGRESS, resultData);
    }
}

ඔබේ මැනිෆෙස්ටයට සේවාව එක් කරන්න:

<service android:name=".DownloadService"/>

ක්‍රියාකාරකම මේ ආකාරයෙන් පෙනෙනු ඇත:

// initialize the progress dialog like in the first example

// this is how you fire the downloader
mProgressDialog.show();
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra("url", "url of the file to download");
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(intent);

ResultReceiverසෙල්ලම් කිරීමට පැමිණියේ මෙන්න :

private class DownloadReceiver extends ResultReceiver{

    public DownloadReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {

        super.onReceiveResult(resultCode, resultData);

        if (resultCode == DownloadService.UPDATE_PROGRESS) {

            int progress = resultData.getInt("progress"); //get the progress
            dialog.setProgress(progress);

            if (progress == 100) {
                dialog.dismiss();
            }
        }
    }
}

2.1 බිම් පුස්තකාලය භාවිතා කරන්න

ග්‍රවුන්ඩි යනු පසුබිම් සේවාවක කේත කෑලි ධාවනය කිරීමට මූලික වශයෙන් ඔබට උදව් වන පුස්තකාලයක් වන අතර එය පදනම් වී ඇත්තේResultReceiverඉහත පෙන්වාඇතිසංකල්පයමත ය. මෙම පුස්තකාලය මේමොහොතේ අතහැර දමා ඇත. මෙම ආකාරය වේ මුළු කේතය වගේ ඇත:

ඔබ සංවාදය පෙන්වන ක්‍රියාකාරකම ...

public class MainActivity extends Activity {

    private ProgressDialog mProgressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.btn_download).setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                String url = ((EditText) findViewById(R.id.edit_url)).getText().toString().trim();
                Bundle extras = new Bundler().add(DownloadTask.PARAM_URL, url).build();
                Groundy.create(DownloadExample.this, DownloadTask.class)
                        .receiver(mReceiver)
                        .params(extras)
                        .queue();

                mProgressDialog = new ProgressDialog(MainActivity.this);
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setCancelable(false);
                mProgressDialog.show();
            }
        });
    }

    private ResultReceiver mReceiver = new ResultReceiver(new Handler()) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);
            switch (resultCode) {
                case Groundy.STATUS_PROGRESS:
                    mProgressDialog.setProgress(resultData.getInt(Groundy.KEY_PROGRESS));
                    break;
                case Groundy.STATUS_FINISHED:
                    Toast.makeText(DownloadExample.this, R.string.file_downloaded, Toast.LENGTH_LONG);
                    mProgressDialog.dismiss();
                    break;
                case Groundy.STATUS_ERROR:
                    Toast.makeText(DownloadExample.this, resultData.getString(Groundy.KEY_ERROR), Toast.LENGTH_LONG).show();
                    mProgressDialog.dismiss();
                    break;
            }
        }
    };
}

GroundyTaskවිසින් භාවිතා ක්රියාත්මක Groundy ගොනුව බාගත සහ ප්රගතිය පෙන්වන්න:

public class DownloadTask extends GroundyTask {    
    public static final String PARAM_URL = "com.groundy.sample.param.url";

    @Override
    protected boolean doInBackground() {
        try {
            String url = getParameters().getString(PARAM_URL);
            File dest = new File(getContext().getFilesDir(), new File(url).getName());
            DownloadUtils.downloadFile(getContext(), url, dest, DownloadUtils.getDownloadListenerForTask(this));
            return true;
        } catch (Exception pokemon) {
            return false;
        }
    }
}

මෙය මැනිෆෙස්ටයට එක් කරන්න:

<service android:name="com.codeslap.groundy.GroundyService"/>

මම හිතන්නේ එය පහසු විය නොහැක. ගිතුබ් වෙතින් නවතම භාජනය අල්ලාගෙන ඔබ යන්න සූදානම්. ග්‍රවුන්ඩි බව මතක තබා ගන්න හි ප්රධාන අරමුණ ඉතා පහසුවෙන් සමග UI එහි පසුබිම සේවා සහ පශ්චාත් ප්රතිඵල බාහිර බෝපාල් ඒපීඅයි ඇමතුම් සිදු කිරීමට නියමිත ය. ඔබ ඔබේ යෙදුමේ එවැනි දෙයක් කරන්නේ නම්, එය සැබවින්ම ප්‍රයෝජනවත් විය හැකිය.

2.2 https://github.com/koush/ion භාවිතා කරන්න

3. DownloadManagerපන්තිය භාවිතා කරන්න ( GingerBreadසහ නව පමණක්)

ජින්ජර් බ්‍රෙඩ් විසින් නව අංගයක් ගෙන එන ලද DownloadManagerඅතර, එමඟින් ලිපිගොනු පහසුවෙන් බාගත කර ගැනීමටත්, නූල්, ධාරා ආදිය හැසිරවීමේ වෙහෙස මහන්සි වී පද්ධතියට පැවරීමටත් ඉඩ සලසයි.

පළමුව, උපයෝගීතා ක්‍රමයක් බලමු:

/**
 * @param context used to check the device version and DownloadManager information
 * @return true if the download manager is available
 */
public static boolean isDownloadManagerAvailable(Context context) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
        return true;
    }
    return false;
}

ක්‍රමයේ නම ඒ සියල්ල පැහැදිලි කරයි. DownloadManagerලබා ගත හැකි බව ඔබට සහතික වූ පසු , ඔබට මෙවැනි දෙයක් කළ හැකිය:

String url = "url you want to download";
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Some descrition");
request.setTitle("Some title");
// in order for this if to run, you must use the android 3.2 to compile your app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    request.allowScanningByMediaScanner();
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext");

// get download service and enqueue file
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

බාගත කිරීමේ ප්‍රගතිය දැනුම්දීම් තීරුවේ පෙන්වනු ඇත.

අවසාන සිතුවිලි

පළමු හා දෙවන ක්‍රම අයිස් කුට්ටියේ අගයක් පමණි. ඔබගේ යෙදුම ශක්තිමත් වීමට අවශ්‍ය නම් ඔබ මතක තබා ගත යුතු බොහෝ දේ ඇත. මෙන්න කෙටි ලැයිස්තුවක්:

  • පරිශීලකයාට අන්තර්ජාල සම්බන්ධතාවයක් තිබේදැයි ඔබ පරීක්ෂා කළ යුතුය
  • ඔබට නිවැරදි අවසරයන් ඇති බවට වග බලා ගන්න ( INTERNETසහ WRITE_EXTERNAL_STORAGE); ද ACCESS_NETWORK_STATEඔබ අන්තර්ජාල ලබා පරීක්ෂා කිරීමට අවශ්ය නම්.
  • ඔබ ගොනු බාගත කිරීමට යන නාමාවලිය පවතින බවටත් ලිඛිත අවසර ඇති බවටත් වග බලා ගන්න.
  • බාගත කිරීම ඉතා විශාල නම්, පෙර උත්සාහයන් අසාර්ථක වුවහොත් බාගත කිරීම නැවත ආරම්භ කිරීමට ක්‍රමයක් ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය විය හැකිය.
  • බාගැනීමට බාධා කිරීමට ඔබ ඉඩ දුන්නොත් පරිශීලකයින් කෘත ful වනු ඇත.

බාගත කිරීමේ ක්‍රියාවලිය පිළිබඳ සවිස්තරාත්මක පාලනයක් ඔබට අවශ්‍ය නොවන්නේ නම්, භාවිතා කිරීම ගැන සලකා බලන්න DownloadManager නොවන්නේ නම්, (3) මන්ද එය දැනටමත් ඉහත ලැයිස්තුගත කර ඇති බොහෝ අයිතමයන් හසුරුවයි.

නමුත් ඔබේ අවශ්‍යතා වෙනස් විය හැකි බව සලකන්න. උදාහරණයක් ලෙස, DownloadManager ප්‍රතිචාර හැඹිලියක් නොකරයි . එය එකම විශාල ගොනුව කිහිප වතාවක් අන්ධ ලෙස බාගත කරනු ඇත. කාරණයෙන් පසු එය නිවැරදි කිරීමට පහසු ක්‍රමයක් නොමැත. ඔබ මූලික HttpURLConnection(1, 2) සමඟ ආරම්භ කරන්නේ නම් , ඔබට අවශ්‍ය වන්නේ එකතු කිරීම පමණි HttpResponseCache. එබැවින් මූලික, සම්මත මෙවලම් ඉගෙනීමේ ආරම්භක උත්සාහය හොඳ ආයෝජනයක් විය හැකිය.

ProgressDialog යනු මොඩල් සංවාදයක් වන අතර එමඟින් පරිශීලකයා යෙදුම සමඟ අන්තර් ක්‍රියා කිරීම වළක්වයි. මෙම පංතිය භාවිතා කරනවා වෙනුවට, ඔබ ඔබේ යෙදුමේ UI තුළට කාවැද්දිය හැකි ProgressBar වැනි ප්‍රගති දර්ශකයක් භාවිතා කළ යුතුය. විකල්පයක් ලෙස, කාර්යයේ ප්‍රගතිය පරිශීලකයා දැනුවත් කිරීමට ඔබට දැනුම් දීමක් භාවිතා කළ හැකිය. වැඩි විස්තර සඳහා සබැඳිය


8
DownloadManager යනු මෙහෙයුම් පද්ධතියේ කොටසකි, එයින් අදහස් වන්නේ එය සැමවිටම GB + වලින් ලබා ගත හැකි අතර එය අස්ථාපනය කළ නොහැක.
ක්‍රිස්ටියන්

17
ක්‍රිස්ටියන්ගේ පිළිතුරේ ගැටලුවක් තිබේ. මොකද " 1 හි කේතය AsyncTask භාවිතා කර සංවාදයක බාගත කිරීමේ ප්‍රගතිය පෙන්වන්න " connection.connect (); ඉන්පුට්ස්ට්රීම් ආදානය = නව බෆර්ඩ්ඉන්පුට්ස්ට්රීම් (url.openStream ()); කේතය සේවාදායකයට සම්බන්ධතා 2 ක් කරයි. කේතය පහත පරිදි යාවත්කාලීන කිරීමෙන් මෙම හැසිරීම වෙනස් කිරීමට මට හැකි වී ඇත InputStream input = new BufferedInputStream (connection.getInputStream ());
nLL

103
ඇන්ඩ්‍රොයිඩ් ප්‍රලේඛනය මෙම සංක්ෂිප්ත බව මම ප්‍රාර්ථනා කරමි.
ලූ මෝර්ඩා

12
ඒ වෙනුවට close()ධාරාවන්ට ( inputසහ output) යෝජනා කර ඇත , එසේ නොමැති නම් මීට පෙර කිසියම් ව්‍යතිරේකයක් විසි කරනු ලැබුවහොත් , ඔබ වටා නොනවත්වා ගලා යන දිය පහරවල් ඇත. finallytryclose()
පැන්ග්

32
ඒ වෙනුවට දෘඩ කේත / sdcard/භාවිතා නොකරන්න Environment.getExternalStorageDirectory().
නිමා ජී

109

ඔබ අන්තර්ජාලයෙන් දේවල් බාගත කරන්නේ නම් ඔබේ මැනිෆෙස්ට් ගොනුවට අවසර එක් කිරීමට අමතක නොකරන්න!

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloandroid"
    android:versionCode="1"
    android:versionName="1.0">

        <uses-sdk android:minSdkVersion="10" />

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

        <application 
            android:icon="@drawable/icon" 
            android:label="@string/app_name" 
            android:debuggable="true">

        </application>

</manifest>

1
මට විශ්වාසයි ඔබට READ_PHONE_STATE අවශ්‍ය නොවන අතර ඔබට අනිවාර්යයෙන්ම WRITE_EXTERNAL_STORAGE අවශ්‍ය නොවේ; ගබඩා ප්‍රවේශ රාමුව භාවිතා කිරීමෙන් වළක්වා ගත හැකි භයානක අවසරයකි.
මොනිකා නැවත ස්ථාපනය කරන්න

34

ඔව් ඉහත කේතය ඔබේ යාවත්කාලීන කිරීම කරන්නේ නම් .එහෙත් වැඩ කරනු ඇත progressbarතුලonProgressUpdate වන Asynctask අතර ඔබ ආපසු බොත්තම ඔබන්න හෝ ඔබගේ ක්රියාකාරකම් අවසන් AsyncTaskඔබ නැවත ඔබේ ක්රියාකාරකම් යන විට ඔබේ UI .ඒ වගේම එහි මාර්ගය අහිමිවෙනවා, බාගත පසුබිම තුළ ධාවනය පවා නම් ඔබට පෙනෙනු ඇත ප්‍රගති තීරුවේ යාවත්කාලීනයක් නොමැත. එබැවින් ධාවන පසුබිමෙන් යාවත්කාලීන වන අගයන් සමඟ ur ර් යාවත්කාලීන කරන ටයිමර් කාර්යයක් OnResume()වැනි නූල් ධාවනය කිරීමට උත්සාහ කරන්න .runOnUIThreadprogressbarAsyncTask

private void updateProgressBar(){
    Runnable runnable = new updateProgress();
    background = new Thread(runnable);
    background.start();
}

public class updateProgress implements Runnable {
    public void run() {
        while(Thread.currentThread()==background)
            //while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(1000); 
                Message msg = new Message();
                progress = getProgressPercentage();        
                handler.sendMessage(msg);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } catch (Exception e) {
        }
    }
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        progress.setProgress(msg.what);
    }
};

අමතක කරන්න එපා ක්‍රියාකාරකම් නොපෙනෙන විට නූල් විනාශ .

private void destroyRunningThreads() {
    if (background != null) {
        background.interrupt();
        background=null;
    }
}

1
මෙය හරියටම මගේ ගැටලුවයි. ප්‍රගති තීරුව යාවත්කාලීන කිරීම සඳහා කාලරාමු කාර්යයක් කරන්නේ කෙසේදැයි මට කියන්න පුළුවන්ද? පිටුපසින් ධාවනය වන AsyncTask වෙතින් අගයන් යාවත්කාලීන කරන්නේ කෙසේද
user1417127

2
okk ගෝලීය හෝ ස්ථිතික විචල්‍යයක් අසයික්ටාස්ක් වෙතින් යාවත්කාලීන කළ යුත්තේ කොතැනටද යන්න ... හෝ ඔබට එය ආරක්ෂිත පැත්තක් සඳහා ඩේටාබේස් තුළ ඇතුළත් කළ හැකිය..එම නිසා වසා දැමීමේ යෙදුම බාධාවක් නොවනු ඇත..එමෙන්ම ඔබ යාවත්කාලීන කිරීමට අවශ්‍ය ක්‍රියාකාරකම් නැවත ආරම්භ කරන විට UI යූඅයි නූල් ධාවනය කරයි.. පහත උදාහරණය බලන්න
ෂීටල්

යූඅයි හි නැවුම් සඳහනක් තිබිය යුතුය .. මගේ නඩුවේ අලුතෙන් අක්‍රිය වූ ප්‍රගති තීරුව මෙන්
ෂීටල්

ෂීටල්, නමුත් එය ඔබේ කේතය නොමැතිව හොඳින් ක්‍රියාත්මක වේ! මන්ද?! මගේ උපාංගය ඇන්ඩ්‍රොයිඩ් 4.0.4 සමඟ එක්ස්පීරියා පී ය. ස්ථිතික බූලියන් විචල්‍යයක් මා විසින් නිර්වචනය කර ඇති අතර එය onPreExecute එය සත්‍ය ලෙසත් onPostExecute එය අසත්‍ය ලෙසත් සකසයි. එය අප බාගත කරනවාද නැද්ද යන්න පෙන්වයි, එබැවින් විචල්‍යය සත්‍යයට සමාන දැයි අපට පරීක්ෂා කළ හැකිය, පෙර ප්‍රගති තීරුව පෙන්වන්න.
බෙහ්සාඩ්

ඔබේ කේතය ටිකක් අපැහැදිලි ය, ඔබට මට උපදෙස් කිහිපයක් කියන්න පුළුවන්ද?
iSun

19

මගේ ව්‍යාපෘති නෙට්රොයිඩ් භාවිතා කිරීමට මම ඔබට නිර්දේශ කරමි , එය වොලී මත පදනම් වේ . බහු සිදුවීම් ඇමතුම්, ගොනු බාගැනීම් කළමනාකරණය වැනි සමහර අංග මම එයට එකතු කර ඇත්තෙමි. මෙය යම් උපකාරයක් විය හැකිය.


2
එය බහු ගොනු බාගැනීම් සඳහා සහය දක්වයිද? මම වැඩ කරන්නේ පරිශීලකයාට නියමිත වේලාවට බාගත කිරීමට ඉඩ දෙන ව්‍යාපෘතියක ය. නිශ්චිත වේලාවක (උදාහරණයක් ලෙස පෙ.ව. 12), සේවාව විසින් පරිශීලකයා කලින් තෝරාගත් සියලුම සබැඳිය බාගත කරනු ඇත. මම අදහස් කළේ මට අවශ්‍ය සේවාවට බාගත කිරීමේ සබැඳි පෝලිම් කිරීමට හැකි විය යුතු අතර පසුව ඒවා සියල්ලම බාගත කරන්න (එකින් එක හෝ සමාන්තරව, පරිශීලකයා මත රඳා පවතී). ස්තූතියි
හොං ට්‍රිං

iapiavgh ඔව්, ඔබට අවශ්‍ය සියල්ල තෘප්තිමත් විය, ඔබට මගේ නියැදි apk පරීක්ෂා කර බැලිය හැකිය, එයට ගොනු බාගැනීම් කළමනාකරණ නිරූපණයක් ඇතුළත් විය.
වින්ස් ස්ටයිලිං

නියම පුස්තකාලය! HTTPS Url වෙතින් අන්තර්ගතය බාගත කර SSLSocketFactoryගැනීමේදී මට ගැටළු ඇති වුවද, හොඳට ක්‍රියා කරයි, යමෙකුට ඔබේම දෑ එකතු කර HostnameVerifierගත නොහැකි වුවද මට එවැනි සත්‍යාපකයක් අවශ්‍ය වේ. ඒ සම්බන්ධයෙන් ප්‍රශ්නයක් මතු කළා.
DarkCygnus

වොලී සඳහා සබැඳිය . -> හමු නොවීය
රූමිත් පටෙල්

15

එකම සන්දර්භය තුළ AsyncTaskනිර්මාණය කිරීම හැසිරවීම සඳහා මම පන්තිය වෙනස් කර ඇත progressDialog.මම පහත කේතය නැවත භාවිතා කළ හැකි යැයි සිතමි. (ඕනෑම ක්‍රියාකාරකමකින් එය සන්දර්භය පසුකර, ඉලක්ක ගොනුව, සංවාද පණිවිඩය ඇමතිය හැකිය)

public static class DownloadTask extends AsyncTask<String, Integer, String> {
    private ProgressDialog mPDialog;
    private Context mContext;
    private PowerManager.WakeLock mWakeLock;
    private File mTargetFile;
    //Constructor parameters :
    // @context (current Activity)
    // @targetFile (File object to write,it will be overwritten if exist)
    // @dialogMessage (message of the ProgresDialog)
    public DownloadTask(Context context,File targetFile,String dialogMessage) {
        this.mContext = context;
        this.mTargetFile = targetFile;
        mPDialog = new ProgressDialog(context);

        mPDialog.setMessage(dialogMessage);
        mPDialog.setIndeterminate(true);
        mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mPDialog.setCancelable(true);
        // reference to instance to use inside listener
        final DownloadTask me = this;
        mPDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                me.cancel(true);
            }
        });
        Log.i("DownloadTask","Constructor done");
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }
            Log.i("DownloadTask","Response " + connection.getResponseCode());

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(mTargetFile,false);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    Log.i("DownloadTask","Cancelled");
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user
        // presses the power button during download
        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                getClass().getName());
        mWakeLock.acquire();

        mPDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mPDialog.setIndeterminate(false);
        mPDialog.setMax(100);
        mPDialog.setProgress(progress[0]);

    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("DownloadTask", "Work Done! PostExecute");
        mWakeLock.release();
        mPDialog.dismiss();
        if (result != null)
            Toast.makeText(mContext,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(mContext,"File Downloaded", Toast.LENGTH_SHORT).show();
    }
}

වේක් අගුළු අවසරය එක් කිරීමට අමතක නොකරන්න <use-අවසරය android: name = "android.permission.WAKE_LOCK" />
සාහු

9

නව ගොනුවකින් "/ sdcard ..." ආදේශ කිරීමට අමතක නොකරන්න ("/ mnt / sdcard / ...") එසේ නොමැතිනම් ඔබට FileNotFoundException ලැබෙනු ඇත


2 වන කොටසින් සේවයෙන් බාගත කිරීම ප්‍රගති සංවාදයට ප්‍රගති වර්ධකයක් පෙන්විය නොහැක. එය සෘජු ප්රතිලාභ 100, එසේ නම් 100 සෘජු චෙක්පත setprogress 100 ක් හා වැටුප් වර්ධක ප්රගතිය ?? එය පමණක් 0 ප්රගතිය ප්රදර්ශනය ආකාරය නමුත් ඇත්තටම ධාවනය බාගත, කට ප්රගතියක්
Nirav මේතා

එය ප්‍රදර්ශනය කරන්නේ වෙනත් වැඩ 100 න් 0% ක් පමණි
නිරව් මේතා

14
එය කරන්න එපා! නැත Environment.getExternalStorageDirectory().getAbsolutePath()SD කාඩ්පතේ කිරීමට මාර්ගය ලබා ගැනීම සඳහා. බාහිර ගබඩාව සවිකර තිබේදැයි පරීක්ෂා කිරීමට අමතක නොකරන්න - Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)( මන්නාස් )
naXa

9

මෙම බ්ලොග් සටහන ඉතා ප්‍රයෝජනවත් බව මට පෙනී ගියේය, එය ගොනුව බාගත කිරීම සඳහා ලූප්ජේ භාවිතා කරයි, එයට ඇත්තේ එක් සරල ශ්‍රිතයක් පමණි, සමහර නව ඇන්ඩ්‍රොයිඩ් යාලුවනේ එය ප්‍රයෝජනවත් වනු ඇත.


8

මම ඇන්ඩ්‍රොයිඩ් සංවර්ධනය ඉගෙන ගැනීමට පටන් ගෙන සිටියදී, එය ProgressDialogයා යුතු මාර්ගය බව මම ඉගෙන ගතිමි . ගොනුව බාගත වන විට ප්‍රගති මට්ටම යාවත්කාලීන කිරීම සඳහා ආයාචනා කළ හැකි setProgressක්‍රමයක් තිබේ ProgressDialog.

බොහෝ යෙදුම්වල මා දැක ඇති හොඳම දේ නම්, මෙම ප්‍රගති සංවාදයේ ගුණාංග කොටස් අනුවාදයට වඩා ප්‍රගති සංවාදයට වඩා හොඳ පෙනුමක් සහ හැඟීමක් ලබා දීම සඳහා ඒවා රිසිකරණය කිරීමයි. ගෙම්බා, අලි හෝ හුරුබුහුටි බළලුන් / බලු පැටවුන් වැනි සජීවිකරණ සමඟ පරිශීලකයා නිරත වීම හොඳය. ප්‍රගති සංවාදයේ ඇති ඕනෑම සජීවිකරණයක් පරිශීලකයින් ආකර්ෂණය කර ගන්නා අතර දිගු වේලාවක් බලා සිටීම ඔවුන්ට දැනෙන්නේ නැත.



6

මගේ පෞද්ගලික උපදෙස් භාවිතා කිරීමයි ප්රගති ඩයලොග් සහ ක්රියාත්මක පෙර ගොඩනඟා, හෝ ආරම්භ OnPreExecute(), ඔබ ප්රගතිය සංවාද ප්රගතිය තීරුව තිරස් ආකාරයේ භාවිතා කරන්නේ නම් ප්රගතිය බොහෝ විට ප්රකාශයට පත් කරනු ලබයි. ඉතිරි කොටස වන්නේ ඇල්ගොරිතම ප්‍රශස්ත කිරීමයිdoInBackground .


6

ඇන්ඩ්‍රොයිඩ් විමසුම් පුස්තකාලය භාවිතා කරන්න ProgressDialog.

File target = new File(new File(Environment.getExternalStorageDirectory(), "ApplicationName"), "tmp.pdf");
new AQuery(this).progress(R.id.progress_view).download(_competition.qualificationScoreCardsPdf(), target, new AjaxCallback<File>() {
    public void callback(String url, File file, AjaxStatus status) {
        if (file != null) {
            // do something with file  
        } 
    }
});

කාරණය නම්, මම එය භාවිතා කිරීම නැවැත්තුවා, මන්ද එහි නොදන්නා නිසා මෙය තවදුරටත් හොඳ පිළිතුරක් යැයි නොසිතන්න.
රෙනෙටික්

4

ඇන්ඩ්‍රොයිඩ් විමසුම ඉතා විශාල බැවින් සෞඛ්‍ය සම්පන්නව සිටීමට නොහැකි නිසා මම දැන් භාවිතා කරන වෙනත් විසඳුමක් සඳහා තවත් පිළිතුරක් එක් කරමි. එබැවින් මම මෙම https://github.com/amitshekhariitbhu/Fast-Android-Networking වෙත ගියෙමි .

    AndroidNetworking.download(url,dirPath,fileName).build()
      .setDownloadProgressListener(new DownloadProgressListener() {
        public void onProgress(long bytesDownloaded, long totalBytes) {
            bar.setMax((int) totalBytes);
            bar.setProgress((int) bytesDownloaded);
        }
    }).startDownload(new DownloadListener() {
        public void onDownloadComplete() {
            ...
        }

        public void onError(ANError error) {
            ...
        }
    });

3

අවසර

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission 
   android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

HttpURLConnection භාවිතා කිරීම

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class DownloadFileUseHttpURLConnection extends Activity {

ProgressBar pb;
Dialog dialog;
int downloadedSize = 0;
int totalSize = 0;
TextView cur_val;
String dwnload_file_path =  
"http://coderzheaven.com/sample_folder/sample_file.png";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button) findViewById(R.id.b1);
    b.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
             showProgress(dwnload_file_path);

                new Thread(new Runnable() {
                    public void run() {
                         downloadFile();
                    }
                  }).start();
        }
    });
}

void downloadFile(){

    try {
        URL url = new URL(dwnload_file_path);
        HttpURLConnection urlConnection = (HttpURLConnection)   
 url.openConnection();

        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);

        //connect
        urlConnection.connect();

        //set the path where we want to save the file           
        File SDCardRoot = Environment.getExternalStorageDirectory(); 
        //create a new file, to save the downloaded file 
        File file = new File(SDCardRoot,"downloaded_file.png");

        FileOutputStream fileOutput = new FileOutputStream(file);

        //Stream used for reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        //this is the total size of the file which we are downloading
        totalSize = urlConnection.getContentLength();

        runOnUiThread(new Runnable() {
            public void run() {
                pb.setMax(totalSize);
            }               
        });

        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0;

        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
            fileOutput.write(buffer, 0, bufferLength);
            downloadedSize += bufferLength;
            // update the progressbar //
            runOnUiThread(new Runnable() {
                public void run() {
                    pb.setProgress(downloadedSize);
                    float per = ((float)downloadedSize/totalSize) *     
                    100;
                    cur_val.setText("Downloaded " + downloadedSize +  

                    "KB / " + totalSize + "KB (" + (int)per + "%)" );
                }
            });
        }
        //close the output stream when complete //
        fileOutput.close();
        runOnUiThread(new Runnable() {
            public void run() {
                // pb.dismiss(); // if you want close it..
            }
        });         

    } catch (final MalformedURLException e) {
        showError("Error : MalformedURLException " + e);        
        e.printStackTrace();
    } catch (final IOException e) {
        showError("Error : IOException " + e);          
        e.printStackTrace();
    }
    catch (final Exception e) {
        showError("Error : Please check your internet connection " +  
e);
    }       
}

void showError(final String err){
    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(DownloadFileDemo1.this, err,  
      Toast.LENGTH_LONG).show();
        }
    });
}

void showProgress(String file_path){
    dialog = new Dialog(DownloadFileDemo1.this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.myprogressdialog);
    dialog.setTitle("Download Progress");

    TextView text = (TextView) dialog.findViewById(R.id.tv1);
    text.setText("Downloading file from ... " + file_path);
    cur_val = (TextView) dialog.findViewById(R.id.cur_pg_tv);
    cur_val.setText("Starting download...");
    dialog.show();

     pb = (ProgressBar)dialog.findViewById(R.id.progress_bar);
     pb.setProgress(0);
            pb.setProgressDrawable(
      getResources().getDrawable(R.drawable.green_progress));  
  }
}

3

LiveData සහ coroutines භාවිතා කර බාගත කළමණාකරුගේ ප්‍රගතිය ඔබට නිරීක්ෂණය කළ හැකිය, පහත සාරාංශය බලන්න

https://gist.github.com/FhdAlotaibi/678eb1f4fa94475daf74ac491874fc0e

data class DownloadItem(val bytesDownloadedSoFar: Long = -1, val totalSizeBytes: Long = -1, val status: Int)

class DownloadProgressLiveData(private val application: Application, private val requestId: Long) : LiveData<DownloadItem>(), CoroutineScope {

    private val downloadManager by lazy {
        application.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    }

    private val job = Job()

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.IO + job

    override fun onActive() {
        super.onActive()
        launch {
            while (isActive) {
                val query = DownloadManager.Query().setFilterById(requestId)
                val cursor = downloadManager.query(query)
                if (cursor.moveToFirst()) {
                    val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
                    Timber.d("Status $status")
                    when (status) {
                        DownloadManager.STATUS_SUCCESSFUL,
                        DownloadManager.STATUS_PENDING,
                        DownloadManager.STATUS_FAILED,
                        DownloadManager.STATUS_PAUSED -> postValue(DownloadItem(status = status))
                        else -> {
                            val bytesDownloadedSoFar = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))
                            val totalSizeBytes = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))
                            postValue(DownloadItem(bytesDownloadedSoFar.toLong(), totalSizeBytes.toLong(), status))
                        }
                    }
                    if (status == DownloadManager.STATUS_SUCCESSFUL || status == DownloadManager.STATUS_FAILED)
                        cancel()
                } else {
                    postValue(DownloadItem(status = DownloadManager.STATUS_FAILED))
                    cancel()
                }
                cursor.close()
                delay(300)
            }
        }
    }

    override fun onInactive() {
        super.onInactive()
        job.cancel()
    }

}

ඔබට මෙම පංතිය සඳහා භාවිත කේස් උදාහරණයක් ලබා දිය හැකිද?
කරීම් කරිමොව්

3

කොට්ලින් හි ගොනු බාගත කිරීම සඳහා අපට කොරෝටින් සහ වැඩ කළමනාකරු භාවිතා කළ හැකිය.

Build.gradle හි පරායත්තතාවයක් එක් කරන්න

    implementation "androidx.work:work-runtime-ktx:2.3.0-beta01"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1"

වැඩ කළමණාකරු පන්තිය

    import android.content.Context
    import android.os.Environment
    import androidx.work.CoroutineWorker
    import androidx.work.WorkerParameters
    import androidx.work.workDataOf
    import com.sa.chat.utils.Const.BASE_URL_IMAGE
    import com.sa.chat.utils.Constants
    import kotlinx.coroutines.delay
    import java.io.BufferedInputStream
    import java.io.File
    import java.io.FileOutputStream
    import java.net.URL

    class DownloadMediaWorkManager(appContext: Context, workerParams: WorkerParameters)
        : CoroutineWorker(appContext, workerParams) {

        companion object {
            const val WORK_TYPE = "WORK_TYPE"
            const val WORK_IN_PROGRESS = "WORK_IN_PROGRESS"
            const val WORK_PROGRESS_VALUE = "WORK_PROGRESS_VALUE"
        }

        override suspend fun doWork(): Result {

            val imageUrl = inputData.getString(Constants.WORK_DATA_MEDIA_URL)
            val imagePath = downloadMediaFromURL(imageUrl)

            return if (!imagePath.isNullOrEmpty()) {
                Result.success(workDataOf(Constants.WORK_DATA_MEDIA_URL to imagePath))
            } else {
                Result.failure()
            }
        }

        private suspend fun downloadMediaFromURL(imageUrl: String?): String? {

            val file = File(
                    getRootFile().path,
                    "IMG_${System.currentTimeMillis()}.jpeg"
            )

            val url = URL(BASE_URL_IMAGE + imageUrl)
            val connection = url.openConnection()
            connection.connect()

            val lengthOfFile = connection.contentLength
            // download the file
            val input = BufferedInputStream(url.openStream(), 8192)
            // Output stream
            val output = FileOutputStream(file)

            val data = ByteArray(1024)
            var total: Long = 0
            var last = 0

            while (true) {

                val count = input.read(data)
                if (count == -1) break
                total += count.toLong()

                val progress = (total * 100 / lengthOfFile).toInt()

                if (progress % 10 == 0) {
                    if (last != progress) {
                        setProgress(workDataOf(WORK_TYPE to WORK_IN_PROGRESS,
                                WORK_PROGRESS_VALUE to progress))
                    }
                    last = progress
                    delay(50)
                }
                output.write(data, 0, count)
            }

            output.flush()
            output.close()
            input.close()

            return file.path

        }

        private fun getRootFile(): File {

            val rootDir = File(Environment.getExternalStorageDirectory().absolutePath + "/AppName")

            if (!rootDir.exists()) {
                rootDir.mkdir()
            }

            val dir = File("$rootDir/${Constants.IMAGE_FOLDER}/")

            if (!dir.exists()) {
                dir.mkdir()
            }
            return File(dir.absolutePath)
        }
    }

ක්‍රියාකාරකම් පන්තියේ වැඩ කළමණාකරු හරහා බාගත කිරීම ආරම්භ කරන්න

 private fun downloadImage(imagePath: String?, id: String) {

            val data = workDataOf(WORK_DATA_MEDIA_URL to imagePath)
            val downloadImageWorkManager = OneTimeWorkRequestBuilder<DownloadMediaWorkManager>()
                    .setInputData(data)
                    .addTag(id)
                    .build()

            WorkManager.getInstance(this).enqueue(downloadImageWorkManager)

            WorkManager.getInstance(this).getWorkInfoByIdLiveData(downloadImageWorkManager.id)
                    .observe(this, Observer { workInfo ->

                        if (workInfo != null) {
                            when {
                                workInfo.state == WorkInfo.State.SUCCEEDED -> {
                                    progressBar?.visibility = View.GONE
                                    ivDownload?.visibility = View.GONE
                                }
                                workInfo.state == WorkInfo.State.FAILED || workInfo.state == WorkInfo.State.CANCELLED || workInfo.state == WorkInfo.State.BLOCKED -> {
                                    progressBar?.visibility = View.GONE
                                    ivDownload?.visibility = View.VISIBLE
                                }
                                else -> {
                                    if(workInfo.progress.getString(WORK_TYPE) == WORK_IN_PROGRESS){
                                        val progress = workInfo.progress.getInt(WORK_PROGRESS_VALUE, 0)
                                        progressBar?.visibility = View.VISIBLE
                                        progressBar?.progress = progress
                                        ivDownload?.visibility = View.GONE

                                    }
                                }
                            }
                        }
                    })

        }

1

වැදගත්

ඇන්ඩ්‍රොයිඩ් 11 හි AsyncTask ඉවත් කර ඇත.

වැඩි විස්තර සඳහා කරුණාකර පහත ලිපි බලන්න

ගූගල් විසින් යෝජනා කර ඇති පරිදි බොහෝ විට සමගාමී රාමුවට යා යුතුය

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.