2016-11-05 3 views
0

Ich habe eine FullRest-API, die einen StatusCode zurückgibt, und mir gelingt, das Problem ist, kann der Fortschritt Dialog nicht von AsyncTask aufgerufen werden, ich möchte nur zeigen, was passiert ist, if(statusCode == 201) .. Erfolgreiche POST, so weit:Wie erstellt man einen Fortschrittsdialog innerhalb von AsyncTask?

PostBaseClass ..

public class PostBase { 

private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 
private String Url="http://192.168.0.101:3000/"; 

OkHttpClient client = new OkHttpClient(); 

int POST(final PostModel model) throws IOException{ 
    Gson gson = new Gson(); 
    String modelJson = gson.toJson(model); 

    RequestBody body = RequestBody.create(JSON,modelJson); 
    Request request = new Request.Builder() 
      .url(Url + "api/gone/POST") 
      .post(body) 
      .build(); 
    Response response = client.newCall(request).execute(); 
    return response.code(); 
} 

MainActivity ..

public void MakePost(final PostModel postModel){ 
    new AsyncTask<Void,Void,Void>(){ 
     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       PostBase postBase = new PostBase(); 
       statusCode = postBase.POST(postModel); 
       if(statusCode == 201){ 
        //TODO 
       }else { 
        //TODO 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 

      } 
      return null; 
     } 
    }.execute(); 
} 

Antwort

4

https://developer.android.com/reference/android/os/AsyncTask.html

onPreExecute und onPostExecute laufen auf dem UI-Thread, während Sie nicht ui von doInBackground aktualisieren können, wie es auf einem Hintergrund-Thread läuft

So Dialoganzeige in onPreExecute und entlässt Dialog in onPostExecute

Return einen Wert in doInBackground und tun, was ist notwendig in onPostExecute basierend auf dem zurückgegebenen Wert.

Wenn Sie Fortschritt des Upload zeigen wollen, können Sie das tun onProgressUpdate mit

new AsyncTask<Void,Void,String>(){ 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute() 
     // runs on the ui thread 
     // show dialog 
    } 
    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      PostBase postBase = new PostBase(); 
      statusCode = postBase.POST(postModel); 
      if(statusCode == 201){ 
       return "successful"; 
      }else { 
       return "notsuccessful" 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } 
     return "something"; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     super.onPostExecute(); 
     // dismiss dialog 
     if(result.equals("successful") 
     { 
     // do something on successful 
     // runs on the ui thread so do update ui 
     } 
    } 
}.execute(); 

Neben dem AsyncTask Code sieht es aus wie Sie Retrofit verwenden. Sie können auch asynchrone Aufrufe mit demselben durchführen.

+0

Sie so viel Dank! –

2

Platzieren Sie Ihre ProgressDialog in OnPreExecute, Beispielcode unten:

private ProgressDialog pd; 

@Override 
protected void onPreExecute(){ 
    super.onPreExecute(); 
     pd = new ProgressDialog(yourContext); 
     pd.setMessage("Loading..."); 
     pd.show();  
} 

@Override 
protected void onPostExecute(String result){ 
    super.onPostExecute(result); 
     pd.dismiss(); 
} 

Dank

+0

Danke auch :) –

+0

willkommen liebes !!! – Androider

Verwandte Themen