1

AsyncTask に次のコードがあります。AsyncTask に実行させたい唯一のことは、ProgressDialog を表示しながら 1000 ミリ秒スリープすることです。

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;

    }
}

しかし、ボタンを押すとアプリがクラッシュするだけで、デバッガーからの情報が見つかりません。誰でも私にヒントを与えることができますか?

前もって感謝します。

4

5 に答える 5

2

ProgressDialog二度作成しています。から作成物を削除しonPreExecuteます。もう1つのことは、のthis参照をコンストラクターのActivityように渡すことですcontextDeviceScan

import something.something.Logic.*;

public void onClick(View view){

    switch(view.getId())    {

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

    }
}

onPostExecuteまた、他の回答で示唆されているように署名を変更します。

于 2012-06-26T10:47:49.310 に答える
1

このようにしてください....非同期をこのように置きます....それが得られない場合は、私に知らせてください..よろしく

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();  
 }
}
于 2012-06-26T10:55:42.823 に答える
0

コンテキストで渡す必要はありません。Activityそれはクラスのフィールドであると想定されており、doInBackground関数からダイアログを作成することです。

于 2012-06-26T10:44:16.863 に答える
0

Just Change it .

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

TO

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

You show message before dismiss() dialog.

I think that make problem.

Thanks

于 2012-06-26T10:46:20.123 に答える
0

に変更onPostExecute(Integer result)してみてくださいonPostExecute(String result)

于 2012-06-26T10:43:42.370 に答える