1

実装されたプロセス ダイアログで AsyncTask を開始するアクティビティがあります。それはうまくいきます!しかし、asyncTask が終了したときに文字列を返したいです。だから私は onPostExecute - メソッドで何かを返さなければなりません。その結果(文字列)は、AsyncTask を開始したアクティビティで取得したいと考えています。.get() は UI スレッドをブロックするため、使用したくありません。

onPostExecute に何を書き込む必要があり、アクティビティは doInBackground から文字列を取得しますか?

この問題を解決するためのあらゆる種類のヘルプをありがとう;)

今コードで:

class BgDL extends AsyncTask<String, Integer, String> {

    String finishString="";
    private Context context;

    ProgressDialog pdialog;

    public BgDL(Context cxt) {  //get the context (usually "this" from Activity / otherwise progressdialog wont show up!
        context = cxt;
        pdialog = new ProgressDialog(context);

    }


    @Override
    protected String doInBackground(String... strings) {
        OutputStream output;
        ByteArrayOutputStream baos = null;

        try {
            URL url = new URL(strings[0]);
            URLConnection connection = url.openConnection();
            connection.connect();

            int fileLength = connection.getContentLength();

            InputStream input = new BufferedInputStream(url.openStream());
            if (strings[1]=="toString") { // write byte to string  if a file is not given
                baos= new ByteArrayOutputStream();
                output = new DataOutputStream(baos);
            } else { //otherwise to string
                output = new FileOutputStream(strings[1]);
            }
            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
       }
       output.flush();
       output.close();
       input.close();
       if (strings[1]=="toString") { 
           finishString = baos.toString(); //
       } // only write byte to string if a file is not given
    } catch (Exception e) {log.d("ex",e.toString());
    }
    return finishString;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdialog.setTitle("Please wait");
        pdialog.setIndeterminate(false);
        pdialog.setMax(100);
        pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pdialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        pdialog.setProgress(progress[0]);

    }
    protected void onPostExecute(String...finishString) {
        pdialog.dismiss();//!!!!!!!!!finishString i want to pass over to my Activity, which started this asynctask with .execute();
    }
4

3 に答える 3

2

以下に示すように、アクティビティを拡張するクラスをプロジェクトに作成します。

public class SomeClass extends Activity
{
    public void dataFromPostExecute(String data) 
    {
        System.out.println("in mainactivity");
    }
}

すべてのアクティビティに単一のスレッドが必要な場合は、 Applicationを拡張するクラスを作成するだけです

public class Async extends Application
{
private Socket globalSocket;

    @Override
    public void onCreate()
    {
        //socket = null;
    }

    public Socket getglobalSocket() 
    {
        return globalSocket;
    }

    public void setGlobalSocket(Socket globalSocket) 
    {
        this.globalSocket = globalSocket;
    }
}

Asynctask を拡張するソケット クラスで、次の操作を行います。

public SocketClass extends AsyncTask<String,String,String>
{
    Async app;
    private SomeClass t_act;
    public SocketClass(SomeClass sct) 
    {
        t_act = sct;
        this.con = tst;
        app= ((Async)sct.getApplicationContext());
    }

    protected void onPostExecute(String data)
    {
        t_act.dataFromPostExecute(data);
    }
}

次に、アクティビティで SomeClass を拡張し、以下のようにします。

public class Activity1 extends SomeClass
{
    public void dataFromPostExecute(String data)
        {
            //do whatever you want. "data" of this method contains the values from                                     
              postexecute()
        }
}
于 2013-02-13T05:45:13.150 に答える
1

onPostExecute に何を書き込む必要があり、アクティビティは doInBackground から文字列を取得しますか?

使用している場合は、オンとメソッド のみをAsyncTask更新できます。あなたのメソッドはいくつかのデータを返し、これらのデータはメソッドに送られます(ジェネリックがどのように宣言されているかにもよります)。 一般に、それを行う方法は他にありません。UIonProgressUpdateonPostExecute

doInBackground()onPostExecute

あなたはこれを意味しました:

AsyncTask a = new AsyncTask(Context);
a.execute(Input);

まず、コンストラクターが次のようになることを意味します

public MyAsync(Context c) {
   this.c = c;
}

2番目は、最初のジェネリック型を宣言したことを意味します(入力パラメーターが であると仮定String

private class MyAsync extends AsyncTask<String, Void, String> {
  //...
}


そして、その returnメソッドで更新UIしたいだけで、場所はreturnを返すパラメーターを持つメソッドです。StringdoInBackground()onPostExecuteINStringdoInBackground()

protected void onPostExecute(String stringReturnedFromDoInBackground) 
{
   // some work
}


したがって、別の方法で実行したい場合は、アプリケーション ロジックを変更して、たとえばResultReceiverwithを使用しIntentServiceます。

于 2012-06-22T16:47:59.617 に答える
1

doInBackground() からの戻り値は、onPostExecute() で正式です。だから、あなたはそれを渡すことができるはずです。

于 2012-06-22T16:22:01.650 に答える