AsyncTask问题

时间:2012-06-26 10:40:04

标签: android

我的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;

    }
}

但是当我点击按钮时我的应用程序崩溃,我无法从调试器中找到任何信息。谁能给我一个提示?

提前致谢。

5 个答案:

答案 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()对话框之前显示消息。

我认为这会产生问题。

由于