2012-06-26 46 views
1

我的AsyncTask中有以下代码。我想让AsyncTask做的唯一事情就是睡眠1000毫秒,同时显示一个ProgressDialog。AsyncTask问题

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; 

    } 
} 

但我的应用程序崩溃,只是当我按下按钮,我不能找到调试器的任何信息。任何人都可以给我一个提示吗?

在此先感谢。

+2

如果崩溃,然后logcat的输出吧。 –

+0

logcat或它没有发生! –

回答

2

您所创建的ProgressDialog两次。从onPreExecute删除创建。 另一件事是,通过该Activitythis基准为context在构造函数中的DeviceScan

import something.something.Logic.*; 

public void onClick(View view){ 

    switch(view.getId()) { 

     case R.id.button1: 
      new DeviceScan(MyActivity.this).execute(""); 
     break; 

    } 
} 

而且,改变onPostExecute签名其他答案的建议。

+0

谢谢,这个结果很好! :) –

0

尝试将onPostExecute(Integer result)更改为onPostExecute(String result)

+0

没有工作..无论如何:) –

+0

如果它是Class定义中的String,那么将Integer作为结果的参数仍然是错误的。正如你的例子。 –

0

有没有必要在上下文中传递。它应该是Activity类的一个字段,您所做的是从doInBackground函数创建对话框。

+2

但是,当makeToast需要上下文作为第一个参数时,我应该如何在onPostExecute方法中创建Toast? –

+0

您可以使用父类作为上下文,并在需要时显示 – thepoosh

0

只需更改它。

Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show(); 
dialog.dismiss(); 

TO

dialog.dismiss(); 
    Toast.makeText(_context, "Done!!", Toast.LENGTH_LONG).show(); 

您显示消息之前解雇()对话框。

我觉得这个问题。

感谢

1

做这种方式....把异步像这样....如果你没有得到,然后它让我know..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(); 
} 
}