我的AsyncTask中有以下代码。我想要AsyncTask唯一能做的就是睡眠1000毫秒,同时显示一个ProgressDialog。
package something.something.Logic;
import android.R;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class DeviceScan extends AsyncTask<String, Void, String> {
ProgressDialog dialog;
Context _context;
public DeviceScan(Context context) {
_context = context;
dialog = new ProgressDialog(_context);
}
protected void onPreExecute() {
dialog = new ProgressDialog(_context);
dialog.setTitle("Please Wait");
dialog.setMessage("Searching for devices..");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "";
}
protected void onPostExecute(Integer result) {
/*
* When the background thread is finished, do something here
*/
Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show();
dialog.dismiss();
}
}
然后我用这种方式调用AsyncTask:
import something.something.Logic.*;
public void onClick(View view){
switch(view.getId()) {
case R.id.button1:
new DeviceScan(getApplicationContext()).execute("");
break;
}
}
但是当我点击按钮时我的应用程序崩溃,我无法从调试器中找到任何信息。谁能给我一个提示?
提前致谢。
答案 0 :(得分:2)
您正在创建ProgressDialog
两次。从onPreExecute
中删除创建。
另一件事是,在this
Activity
的{{1}}引用作为context
传递
DeviceScan
另外,按照其他答案的建议更改import something.something.Logic.*;
public void onClick(View view){
switch(view.getId()) {
case R.id.button1:
new DeviceScan(MyActivity.this).execute("");
break;
}
}
的签名。
答案 1 :(得分:1)
这样做......把async放到这样的方式......如果你没有得到它,那就让我知道..Regards
package something.something.Logic;
import android.R;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
ProgressDialog dialog;
public void onClick(View view){
switch(view.getId()) {
case R.id.button1:
new DeviceScan().execute("");
break;
}
}
public class DeviceScan extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
dailog=ProgressDialog.show(classname.this,"Please Wair..","Searching for devices..",false);
}
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "";
}
protected void onPostExecute(Integer result) {
/*
* When the background thread is finished, do something here
*/
dialog.dismiss();
Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show();
}
}
答案 2 :(得分:0)
尝试将onPostExecute(Integer result)
更改为onPostExecute(String result)
。
答案 3 :(得分:0)
没有必要传递上下文。它应该是Activity
类的一个字段,你要做的是从doInBackground
函数创建对话框。
答案 4 :(得分:0)
只需改变它。
Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show();
dialog.dismiss();
TO
dialog.dismiss();
Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show();
在dismiss()对话框之前显示消息。
我认为这会产生问题。
由于