2017-01-17 5 views
1

RestClientという名前のクラスがWebServiceから情報を取得して戻ってきて、インターネットにアクセスしている間に進捗ダイアログを実行しようとしています。そして、私はこのクラスを複数の場所で使うので、私はアクティビティそのものには入れません。ここに私のRestClientクラスです:アクティビティから呼び出されたときに別のAsyncTaskクラスのProgressDialogが表示されない

public class RestClient extends AsyncTask<URL, String, String> { 

    private Context context; 
    private String string; 
public RestClient(Context context, String string) 
{ 
    this.context = context; 
    this.string = string; 
} 

@Override 
protected void onPreExecute() { 
    dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false); 
    //I've already tried: 
    /*ProgressDialog dialog = new ProgressDialog(context); 
    dialog.setTitle("Buscando seu Produto"); 
    dialog.setMessage("Por favor, espere um momento..."); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(false);*/ 

    dialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(URL... params) { 
    try { 

     //Some WebService gets and Json conversions using my string variable 
     //and some Thread.sleep that counts 2000 miliseconds to do all the queries 

     dialog.dismiss(); 

    } catch (IOException | InterruptedException |JSONException e) { 
     e.printStackTrace(); 

     dialog.dismiss(); 

     return e.getMessage(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 


    } 
} 

そして、私はこのようなボタンをクリックしたときに、私の活動に私はクラスRestClientを呼び出す:

---編集:私は、私はAlertDialogでを持っていることを言及するのを忘れてしまいました時々ProgressDialogの前後に表示することができ、この同じ活性---

private Button buttonConfirm; 
    private EditView evString; 

    private String theString; 
    private String returnFromExecute; 

    private RestClient restClient; 


    private AlertDialog.Builder dialog; 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_access_webservice); 

      evString = (EditText) findViewById(R.id.editViewMyString); 
      buttonConfirm = (Button) findViewById(R.id.buttonConfirm); 

      dialog = new ProgressDialog(IdentificacaoDeProdutoActivity.this); 
      dialog.setTitle("Error"); 
      dialog.setMessage("Please try again"); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 


      buttonConfirmar.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) {     
        theString = evString.getText().toString(); 
        if(!(theString!=null && theString.trim().length()>0)) //To check if theString is not null 
        { 
          dialog.show(); 
        } 

        restClient = new RestClient(AccessWebserviceActivity.this, theString); 

        //Then I call execute and put a Thread.sleep a bit longer to compensate the ones I have in my doInBackground 
        restClient.execute(); 
        try { 
         Thread.sleep(2050); 

        } catch (Exception e) { 
         dialog.show(); 
         return; 
        } 
       } 
      } 
     } 

は、問題は私のProgressDialogを示したことがないということです。私はすでにの代わりにgetParent(),getApplication()getApplicationContext()を試してみましたが、何も働いていません。誰か何が起きているのか、私は何をすべきでしょうか?

+0

あなたのAsyncTaskクラスがあなたのActivityクラスの子か、AsnctaskClassが別のパッケージを持っていると言えますか? – Hamza

+0

@AmeerHamza、それは他のアクティビティで使用するため、私のアクティビティの子ではありませんが、私のアクティビティは同じパッケージに含まれていません。 – Cocholate

答えて

1

はスレッドに関する研究の多くとプロセスの後、私は、コードの実行が起こったように

new Thread(new Runnable() { public void run() { // My code } });

の私 RestClient.execute後に私が持っているすべてのコードをカプセル化しなければならなかったことが判明しましたバックグラウンドでもWebServiceクエリでも使用できます。

編集:

新しいスレッドを作成しても、お勧めできません。適切なことは、AsyncTaskを拡張する別のクラスを作成してジョブを実行することです。

1

進捗ダイアログを作成していません。これを試してください。

ProgressDialog dialog; 

@Override 
    protected void onPreExecute() { 
     dialog= new ProgressDialog(context); 
     dialog.setMessage("on Progress"); 
     dialog.show(); 
     super.onPreExecute(); 
    } 
+0

私の質問を否定しないでください。それは簡単ではありません。このプログレスバーは、何に関係なく表示されません。 – Cocholate

+0

私は何も間違った仲間をしていない私は私の答えがあなたのために動作しない理由は驚​​いています。 –

+0

これは問題ありません。私はすべてのブログとすべてのソリューションが言ったすべてを試しましたが、それは動作しませんでした。 – Cocholate

0

あなたはまた置く

dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false); 

を呼び出し、

dialog.show(); 

を削除する必要があり、あなたのdialog.dismiss()。メソッド(onPostExecute()内)。このdialog.dismiss()メソッドはcatchブロックには適していますが、tryブロックでこのメソッドを呼び出す場合は、その目的は何ですか。これをAsyncTaskと呼ぶとすぐに進行状況ダイアログが削除されます。

+0

doInBackgroundメソッドのtryブロックからdismissメソッドを削除しましたか?何かエラーがある場合は、誰かがあなたを助けることができるようにそれを貼り付けます。 – Raheel

+0

はい、あります。私はちょうどそこにそれを置いたところ、これは問題の一つかもしれないが、働いていないと言いました。 – Cocholate

+0

私は 'I/Choreographer:126フレームをスキップしました!アプリケーションがメインスレッドであまりにも多くの作業を行っている可能性があります。 ' – Cocholate

0
returnFromExecute = restClient.get(); 

この文を削除します。あなたは既に:

restClient.execute(); 

そうする必要があります。

doInBackground()の結果は、onPostExecute()で処理する必要があります。 onCreate()で処理または検索できません。

関連する問題