2012-06-26 7 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. Другое дело, передать this ссылку из Activity в качестве 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

По-прежнему неправильно иметь целое число как результат. Параметр, если он является строкой в ​​определении класса. Как и в вашем примере. –

0

не нужно передавать в контексте. он должен быть полем класса Activity, и вы создаете диалог из функции doInBackground.

+2

Но как мне создать Toast в методе onPostExecute, когда makeToast нуждается в контексте в качестве первого параметра? –

+0

вы можете использовать родительский класс в качестве контекста и показывать его всякий раз, когда хотите – thepoosh

0

Просто измените его.

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

К

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(); 
} 
} 
Смежные вопросы