簡體   English   中英

如何使用Android Studio中的AsyncTask阻止我的應用崩潰?

[英]How to stop my app from crashing using AsyncTask in Android Studio?

我已經在Android Studio中構建了一個用戶界面來測試Java中的PSO算法。 我是去年與其他人一起完成這個項目的,而我之前的那個人使用帶有Boolean []參數的AsyncTask來執行他的應用程序。 下面是該類的版本,這是因為他在MainActivity中使用了一個復選框,用戶可以選中該復選框,因此它可以是另一個。

  public class runTests extends AsyncTask<Boolean, Void, Void> {
    @Override
    protected Void doInBackground(Boolean... params) {
        boolean one    = params[0];
        boolean custom = params[1];

        if (one)
            results = runTest("TestOne");
        else if (custom) {
            double[] re = runTest("customTest");
            if (re != null) results = re;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void v) {
        // execution of result of Long time consuming operation
        pd.dismiss();
        if (results[0] != -1 || results != null) {
            loadIntent(results);
        }
    }

    @Override
    protected void onPreExecute() {
        pd = ProgressDialog.show(MainActivity.this, "Busy", "Algorithm is currently executing");
    }
}

我的代碼沒有復選框,只需要執行一個測試即可,而不必選擇兩個。 我只想運行“ CustomUseCase”而已。 我不想使用布爾參數,但是我仍然想要AsyncTask。 請幫我!

public class runTests extends AsyncTask<Boolean, Void, Void> {
    @Override
    protected Void doInBackground(Boolean... params) { //sort this out
        boolean one    = params[0];
        boolean custom = params[1];

        if (one)
            results = runTest("CustomUseCase"); //i only want to run this one!!!
        else if (custom) {
            double[] re = runTest("testOne"); //I don't need this, I dont want to run this test
            if (re != null) results = re;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void v) {
        // execution of result of Long time consuming operation
        if(pd!=null){
            pd.dismiss();
            pd = null;
        }
        if (results[0] != -1 || results != null) {
            loadIntent(results);
        }
    }
  @Override
    protected void onPreExecute() {
        pd = ProgressDialog.show(ParticleActivity.this, "Busy", "Algorithm is currently executing");
    }
}

首先,你需要改變

if (results[0] != -1 || results != null) {
    loadIntent(results);
}

if (results != null && results.length > 0 && results[0] != -1) {
    loadIntent(results);
}

那是if語句“ 短路 ”的一個例子。 如果結果為null,則邏輯AND(&&)運算符將導致整個語句失敗,否則它將評估下一個邏輯語句results[0] != -1 ,而沒有NullPointerException的機會。

也嘗試一下

public class runTests extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) { //sort this out

        results = runTest("CustomUseCase"); //i only want to run this one!!!
    }
    ...
}

更新

執行doInBackground時如何返回null?

為了闡明模板類型列表(即<Void,Void,Void> )的工作方式,下面是一個示例。 在這里,我們有< URLIntegerLong >。 請注意,doInBackground如何采用URL數組並返回Long ,onProgressUpdate采用Integer數組,onPostExecute采用Long

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         long totalSize = urls.length;
         ...
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

對於<Void, Void, Void>我們將擁有(空函數參數列表“()”對應於Void):

private class DownloadFilesTask extends AsyncTask<Void, Void, Void> {
     protected Void doInBackground() {             
         ...
         return;
     }

     protected void onProgressUpdate() {
         setProgressPercent("hi");
     }

     protected void onPostExecute() {
         showDialog("bye");
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM