[英]How can I stop my app from crashing when trying to make a GET request with an 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>
)的工作方式,下面是一個示例。 在這里,我們有< URL
, Integer
, Long
>。 請注意,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.