2012-06-28 4 views
0

를 완료 한 후 나타 나는 다음과 같은 세 가지 클래스가 다음 WorkingThread 완료 후해서 ProgressDialog는 스레드가

나는 WorkingThread가 실행중인해서 ProgressDialog를 표시하려고하면해서 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) 
     { 
     } 
    } 
} 

답변

2

문제는입니다항상 ProgressDialog 작은 불행한

이유는 바로이 ProgressDialog 화재로 라인의 다음 커플은 현재 활동에서 컨텍스트를 꺼내입니다 및 다음 활동 즉 시작 귀하의 경우 display.But에 대한 현재의 활동 상황 필요 FirstActivity입니다. 따라서 progressDialog은 화면에 표시되지 않습니다.

+0

Thx. 처리기 클래스에서 문제를 해결했습니다. http://stackoverflow.com/questions/7061281/display-progressdialog-while-listview-is-loading – Birdman

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

여기에 문제가 있습니다. UI 스레드가 join()의 becaouse를 끝내기 위해 작업 스레드를 기다리고 있습니다.

+0

WorkingThread가 완료 될 때까지 기다리지 않으면 ProgressDialog가 닫힙니다. 즉시 목적을 달성하지 못합니까? – Birdman

+0

@Alex하지만 그렇게합니다. 'wt.join()'호출은 여러분이 그렇게하도록 보장합니다. –

+0

그래서 AsyncTask를 사용해야합니다. 또는 콜백 인터페이스를 만들 수 있으며, 완료되면 스레드에서 호출 할 수 있습니다. –

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를 사용하지 않으려는 편집 내용 만 표시합니다. 나는 당신이하고 싶었던 일을하는 또 다른 방법이기 때문에이 대답을 삭제하지 않을 것입니다.

관련 문제