1

次の3つのクラスがあります。

WorkingThreadの実行中にprogressDialogを表示しようとすると、WorkingThreadが実行された後にのみProgressDialogが表示されます。私は何が間違っているのですか?

AsyncTaskの使用には興味がありません!

-StartActivity:

public class StartActivity extends Activity implements OnClickListener
{
    public ProgressDialog pgd;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        imgv = (ImageView)findViewById(R.id.imageView1);
        tv = (TextView)findViewById(R.id.textview);

        Button btn = (Button)findViewById(R.id.button1);
        btn.setOnClickListener(this);
    }

    public void onClick(View v) 
    {
        pgd = ProgressDialog.show(StartActivity.this, "", "Loading picture"); // Start ProgressDialog before starting activity

        Intent ActivityIntent = new Intent(this, FirstActivity.class);
        startActivityForResult(ActivityIntent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 0 && resultCode == RESULT_OK)
        {
            pgd.dismiss(); //Stop ProgressDialog when FirstActivity is "done"
        }
    }
}

-

-FirstActivity:

public class FirstActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        WorkingThread wt = new WorkingThread();
        wt.start();

        try 
        {
            wt.join();
            Intent ActivityIntent = getIntent();
            setResult(RESULT_OK, ActivityIntent);
            finish();
        } 
        catch (Exception e) 
        {
        }
    }
}

-WorkingThread:

public class WorkingThread extends Thread 
{

    @Override
    public void run() 
    {
        super.run();

        try
        {
            Thread.sleep(5000);
        }
        catch (Exception e)
        {
        }
    }
}
4

3 に答える 3

2

問題はProgressDialog、常に現在のアクティビティコンテキストを表示する必要があることですが、あなたの場合ProgressDialogは少し残念です

その理由はProgressDialog、次の数行を起動するとすぐに、現在のアクティビティからコンテキストが削除され、次のアクティビティが開始されるためです。つまりFirstActivityprogressDialog画面に表示される機会がありません。

于 2012-06-28T11:58:53.100 に答える
2

AsyncTaskを使用します。次に例を示します。

package com.example.test;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

ProgressDialog activityProgressDialog;
private Context context;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    context = this;

    Button btn = (Button)findViewById(R.id.button1);
    btn.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            new TestAsyncTask().execute();
        }
    });
}

private class TestAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        //Called before doInBackground.
        //Initialize your progressDialog here.
        activityProgressDialog = ProgressDialog.show(context,
                "Test",
                "Doing heavy work on background...", false,
                false);
    }

    @Override
    protected Void doInBackground(Void... v) {

        //Do your work here
        //Important!!! Update any UI element on preExcecute and
                    //onPostExcecute not in this method or else you will get an 
                    //exception.
        //The below code just make the thread inactive for 5 seconds.
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            Thread.currentThread().notify();
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void v) {
        //Dismiss the progessDialog here.
        activityProgressDialog.dismiss();
    }
}

 }

AsyncTaskを使用したくないことを編集内容に示します。この回答は、あなたがやりたいことを行う別の方法であるため、(あなたが私に望まない限り)削除しません。

于 2012-06-28T12:13:09.083 に答える
1
try 
        {
            wt.join();
            Intent ActivityIntent = getIntent();
            setResult(RESULT_OK, ActivityIntent);
            finish();
        }

ここにあなたの問題があります。UIスレッドは、作業スレッドが終了するのを待っていjoin()ます。

于 2012-06-28T11:59:44.480 に答える