2012-04-27 33 views
0

Webからデータを取得する非同期タスクがあります。非同期タスクは正常に動作し、データがWebから調達されている間にProgress Dialog Spinnerが表示されるようにします。Progress Dialog Spinnerは決して表示されません。ここに私のコードです:ProgressDialogが表示されない

public class JsonHttpParsingActivity extends ListActivity{ 
private String jsonResult; 
private ArrayList nameArray; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    HttpConnection task = new HttpConnection(this); 
    AsyncTask<String,Void,String> taskResult = task.execute("Some URL..."); 
    try { 
     jsonResult = taskResult.get(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
      . 
      . 
      More Code..... 
} 
} 

public class HttpConnection extends AsyncTask<String, Void, String> { 
private ProgressDialog progressDialog; 
private Activity m_activity; 

protected HttpConnection(Activity activity) { 
    setActivity(activity); 
    } 

    public void setActivity(Activity activity) { 
    m_activity = activity; 

    progressDialog = new ProgressDialog(m_activity); 
    progressDialog.setMessage("Wait ..."); 
    progressDialog.setCancelable(false); 
    progressDialog.setMax(100); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.show(); 
    } 

@Override 
protected String doInBackground(String... params) { 
    BufferedReader in = null; 
    String inputLine= "", finalMessage = ""; 
    HttpURLConnection urlConnection = null; 

    try { 
     String urladdress = params[0]; 
     URL url = new URL(urladdress); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

     while((inputLine = in.readLine()) != null){ 
      finalMessage = finalMessage + inputLine; 
     } 
     in.close(); 
     Log.v("finalmessage", ""+finalMessage); 
    } 
    catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     urlConnection.disconnect(); 
    }  
    return finalMessage; 
} 
protected void onProgressUpdate(Integer... values) { 
    progressDialog.setProgress((int) ((values[0]/(float) values[1]) * 100)); 
    }; 

@Override 
protected void onPostExecute(String result){ 
     progressDialog.hide(); 
} 
} 

ありがとう!あなたは非UIスレッドでそれを表示しようとしているので

答えて

1

代わりのProgressDialogを開始するための別の方法setActivity(activity)(非UIスレッドスコープ) を書くには、AsyncTaskonPreExecute()(UIスレッド)にコードを配置しました。

onPreExecute()関数

+0

私はこれをもっと早く試しました。私にとってはうまくいきませんでした。 – user988639

+1

+1 @ user988639これは正確な方法です。 –

1

コールプログレスバー、これを試してみてください:

public class HttpConnection extends AsyncTask<String, Void, String> { 
    private ProgressDialog progressDialog; 
    private Activity m_activity; 

    protected HttpConnection(Activity activity) { 

     } 

     @Override 
    protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    progressDialog = new ProgressDialog(m_activity); 
     progressDialog.setMessage("Wait ..."); 
     progressDialog.setCancelable(false); 
     progressDialog.setMax(100); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.show(); 

    super.onPreExecute(); 
} 

    @Override 
    protected String doInBackground(String... params) { 
     BufferedReader in = null; 
     String inputLine= "", finalMessage = ""; 
     HttpURLConnection urlConnection = null; 

     try { 
      String urladdress = params[0]; 
      URL url = new URL(urladdress); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

      while((inputLine = in.readLine()) != null){ 
       finalMessage = finalMessage + inputLine; 
      } 
      in.close(); 
      Log.v("finalmessage", ""+finalMessage); 
     } 
     catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      urlConnection.disconnect(); 
     }  
     return finalMessage; 
    } 


    @Override 
    protected void onPostExecute(String result){ 
      progressDialog.hide(); 
    } 
    } 
+0

私はそれを試して、それは動作しませんでした。 – user988639

0

次のコードは正常に動作してテストされてから

protected HttpConnection(Activity activity) { 
    m_activity = activity; 
    } 

Override 
protected void onPreExecute(String result){ 
    progressDialog = new ProgressDialog(m_activity); 
    progressDialog.setMessage("Wait ..."); 
    progressDialog.setCancelable(false); 
    progressDialog.setMax(100); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.show(); 

} 
+0

いいえ、その動作していない..! progressDialog =新しいProgressDialog(m_activity); m_activityが初期化されていないためです。 – user370305

+0

コンストラクタでm_activityを初期化し、setActivity()のコードをonPreExecute()(UI Thread)に配置しますが、Progress Dialogは表示されません。 – user988639

+0

@ user370305: 'Context'インスタンスへの参照を使用してください。あなたの 'AsyncTask'は内部クラスとして実装されているので、' JsonHttpParsingActivity.this' –

0

は別の方法からAsyncTaskを呼び出して試してみてくださいアクティビティ。私の推測は、今、それをアクティビティのonCreateメソッドで呼び出すことです。アクティビティがまだ構築中であるため、例外が発生する可能性があります。この問題が発生したときに私がかつて試みたことは、アクティビティのonPostCreateメソッドから非同期タスクを開始することです。

関連する問題