2017-08-30 3 views
1

J'ai une activité (LoginActivity) qui appelle une classe java (JsonTaskPost). Je veux montrer un progessbar quand l'utilisateur clique sur le bouton et la classe java pendant ce temps fait sa tâche. Je suppose que le code doit fonctionner trop vite pour que la barre de progression soit visible. Alors, comment puis-je ajouter la visibilité de la barre de progression pour, par exemple, 20 secondes? Ou la logique est-elle fausse?comment montrer la barre de progression pour 20sec supplémentaire dans android?

LoginActivity.java

package com.example.mymobileforumbrowser2; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.icu.util.TimeUnit; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import static com.example.mymobileforumbrowser2.MainActivity.LOGIN_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.mSharedEditor; 
import static com.example.mymobileforumbrowser2.MainActivity.makeToast; 
import static com.example.mymobileforumbrowser2.MainActivity.serverUrl; 

public class LoginActivity extends AppCompatActivity { 

    public static TextView serverMessageTxv; 
    EditText usernameEditTxv,passwordEditTxv; 
    Button loginButton; 
    ProgressDialog progress; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     serverMessageTxv = (TextView)findViewById(R.id.server_message); 
     usernameEditTxv = (EditText)findViewById(R.id.username_edittextview); 
     passwordEditTxv = (EditText)findViewById(R.id.password_edittextview); 

     loginButton = (Button)findViewById(R.id.login_button); 

     loginButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) { 

       progress = ProgressDialog.show(LoginActivity.this, "LOG IN", 
         "Logging Please Wait ...", true); 

       new Thread(new Runnable() { // open new thread gia background processing 
        @Override 
        public void run() { 
         String url = serverUrl + "login.php"; 
         //Log.d("EXEC_JSON","CALL JSON"); 
         new JsonTaskPost().execute(url, 
           usernameEditTxv.getText().toString(), 
           passwordEditTxv.getText().toString(), 
           LOGIN_ACTIVITY); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           progress.dismiss(); 
          } 
         }); 
        } 
       }).start(); 
       /* 
       String url = serverUrl + "login.php"; 
       new JsonTaskPost().execute(url, 
         usernameEditTxv.getText().toString(), 
         passwordEditTxv.getText().toString(), 
         LOGIN_ACTIVITY); 
         */ 
      } 
     }); 

    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu, menu); 

     MenuItem topicItem = menu.findItem(R.id.new_topic); 
     topicItem.setVisible(false); 
     MenuItem postItem = menu.findItem(R.id.new_post); 
     postItem.setVisible(false); 
     //MenuItem mapItem = menu.findItem(R.id.map); 
     //mapItem.setVisible(false); 
     MenuItem loginItem = menu.findItem(R.id.login); 
     loginItem.setVisible(false); 
     invalidateOptionsMenu(); 

     return true; 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     Intent intent; 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.preferences: 
       intent = new Intent(this, PreferencesActivity.class); 
       startActivity(intent); 
       return true; 
      case R.id.logout: 
       if(mSharedEditor!= null) 
       { 
        mSharedEditor.putString("Username", ""); 
        mSharedEditor.putBoolean("LoggedIn", false); 
        mSharedEditor.commit(); 
        makeToast(this, "Successfully logged out"); 
       } 
       return true; 
      case R.id.register: 
       intent = new Intent(this, RegisterActivity.class); 
       startActivity(intent); 
       finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

} 

JsonTaskPost.java

package com.example.mymobileforumbrowser2; 

import android.os.AsyncTask; 
import android.util.Log; 

import org.json.JSONObject; 

import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import static com.example.mymobileforumbrowser2.LoginActivity.serverMessageTxv; 
import static com.example.mymobileforumbrowser2.MainActivity.LOGIN_ACTIVITY; 
//import static com.example.mymobileforumbrowser2.MainActivity.MAPS_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.NEWPOST_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.NEWTOPIC_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.POSTS_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.REGISTER_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.TOPICS_ACTIVITY; 
import static com.example.mymobileforumbrowser2.MainActivity.mSharedEditor; 
import static com.example.mymobileforumbrowser2.MainActivity.mSharedPrefs; 
import static com.example.mymobileforumbrowser2.MainActivity.removeHtmlChars; 
import static com.example.mymobileforumbrowser2.MainActivity.stringToListView; 
import static com.example.mymobileforumbrowser2.PostsActivity.adapterPosts; 
import static com.example.mymobileforumbrowser2.PostsActivity.postsListItems; 
import static com.example.mymobileforumbrowser2.RegisterActivity.registerServerMessageTxv; 
import static com.example.mymobileforumbrowser2.TopicsActivity.adapterTopics; 
import static com.example.mymobileforumbrowser2.TopicsActivity.topicsListItems; 

//post-get class 
// fetches topics/posts an ginetai call apo TopicsActivity/PostsActivity 
public class JsonTaskPost extends AsyncTask<String, String, String> 
{ 
    String message = null; 
    String usernameSharedPrefs; 
    String callingActivity; 
    JSONObject jsonObject; 

    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    protected String doInBackground(String... params) { 


     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     OutputStream outStream = null; 
     callingActivity = params[3]; // orizetai apo caller 
     Log.d("Calling Activity",callingActivity); 
     usernameSharedPrefs = params[1]; //string of username if login called, else forum/topic name depending on caller activity 
     Log.d("USERNAME",usernameSharedPrefs); 

     try { 
      URL url = new URL(params[0]); // callers url adress, eg http:localhost/phpbb/fetch_forums.php 
      Log.d("CALLERS URL",params[0]); 
      jsonObject = new JSONObject(); 
      message = paramsTojson(params).toString(); // metatrepei periexomena Json array se string , {"key:","value"} 
      Log.d("MESSAGE",message); 

      connection = (HttpURLConnection) url.openConnection(); //open connection to phpbb database 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setFixedLengthStreamingMode(message.getBytes().length); 
      connection.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 

      outStream = new BufferedOutputStream(connection.getOutputStream()); 
      outStream.write(message.getBytes()); 
      outStream.close(); 

      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 
      String line; 

      while ((line = reader.readLine()) != null) { 
       buffer.append(line+"\n"); 
       Log.d("Response: ", "> " + line); 
      } 
      return buffer.toString(); 


     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (connection != null){ 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     if(result!=null) 
     { 
      if(callingActivity.equals(TOPICS_ACTIVITY)) 
      { 
       stringToListView(result,topicsListItems); 
       adapterTopics.notifyDataSetChanged(); // prosarmogh periexomenwn listview toy topics activity sta nea periexomena 
      } 
      else if(callingActivity.equals(POSTS_ACTIVITY)) 
      { 
       stringToListView(result,postsListItems); 
       adapterPosts.notifyDataSetChanged(); 
      } 
      else if(callingActivity.equals(REGISTER_ACTIVITY)) 
      { 
       result = removeHtmlChars(result); 
       if(result.contains("You are registered")) 
        registerServerMessageTxv.setText(result); 
      } 
      else if(callingActivity.equals(LOGIN_ACTIVITY)) 
      { 
       result = removeHtmlChars(result); 
       serverMessageTxv.setText(result); 
       mSharedEditor = mSharedPrefs.edit(); 
       if (result.contains("You are logged in")) 
       { 
        mSharedEditor.putString("Username",usernameSharedPrefs); 
        mSharedEditor.putBoolean("LoggedIn",true); 
        mSharedEditor.commit(); 
       } 
       else // LOGOUT/no user logged in 
       { 
        mSharedEditor.putString("Username",""); 
        mSharedEditor.putBoolean("LoggedIn",false); 
        mSharedEditor.commit(); 
       } 
      } 

     } 
     super.onPostExecute(result); 
    } 
    protected JSONObject paramsTojson(String... params) 
    { 
     try 
     { 
      if (params[3].equals(LOGIN_ACTIVITY)) { 
       jsonObject.put("username", params[1]); 
       jsonObject.put("password", params[2]); 
      } else if (params[3].equals(TOPICS_ACTIVITY)) { 
       jsonObject.put("forum_name", params[1]); 
       jsonObject.put("number_of_topics", params[2]); 
      } else if (params[3].equals(POSTS_ACTIVITY)) { 
       jsonObject.put("topic_name", params[1]); 
       jsonObject.put("number_of_posts", params[2]); 
      } else if (params[3].equals(REGISTER_ACTIVITY)) { 
       jsonObject.put("username", params[1]); 
       jsonObject.put("password", params[2]); 
       jsonObject.put("email", params[4]); 
      } else if (params[3].equals(NEWTOPIC_ACTIVITY)) { 
       jsonObject.put("forum_name", params[1]); 
       jsonObject.put("topic_title", params[2]); 
       jsonObject.put("username", params[4]); 
      } else if (params[3].equals(NEWPOST_ACTIVITY)) { 
       jsonObject.put("topic_name", params[1]); 
       jsonObject.put("forum_name", params[4]); 
       jsonObject.put("username", params[5]); 
       jsonObject.put("post_text", params[2]); 
      } 
      /* 
      else if (params[3].equals(MAPS_ACTIVITY)) { 
       jsonObject.put("username", params[1]); 
       jsonObject.put("timestamp", params[2]); 
       jsonObject.put("longitude", params[4]); 
       jsonObject.put("latitude", params[5]); 
      } 
      */ 
     } 
     catch (org.json.JSONException e) 
     { 
      e.printStackTrace(); 
     } 
     return jsonObject; 
    } 

} 

Répondre

2

Votre code est erroné, c'est pourquoi cela se produit. Vous appelez progress.dismiss(); juste après avoir appelé votre AsyncTask. C'est pourquoi le progressbar est rejeté avant que la tâche soit terminée.

Vous utilisez déjà JsonTaskPost(AsyncTask), il n'est donc pas nécessaire d'utiliser un fil séparé ici. Et vous devez appeler progress.dismiss(); de onPostExecute de JsonTaskPost car cette méthode est l'endroit où se termine la tâche. Donc pour cela soit vous pouvez créer un rappel pour l'achèvement de la tâche ou passer l'instance progressBar à JsonTaskPost ou directement utiliser AsyncTask dans l'activité elle-même.

1

Lorsque vous rejetez la boîte de dialogue de progression créer un gestionnaire et d'utiliser la méthode postDelayed, il vous permet de retarder le code pendant un certain temps comme celui-ci:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        progress.dismiss(); 
       } 
      }, 20000); 
    } 
}); 

20000 est votre temps en millisecondes, ce qui signifie 20 secondes

Cependant, je pense que vous devez rejeter votre dialogue dans la méthode onPostExecute dans votre tâche

1

vous n'avez pas besoin d'ajouter 20 secondes pour que vous puissiez voir la barre de progression, ce que vous avez besoin est de faire une asyntask pour montrer progressba r dans l'interface utilisateur et dans certaines tâches d'arrière-plan. Dans votre cas, vous pouvez le faire comme ceci:

class BackGround extends AsyncTask<String, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(myActivity.this); 

      pDialog.show(); 

     } 

     @Override 
     public Boolean doInBackground(String... urls) { 
      //Do something... 
      return null; 
     } 

     public void onPostExecute(Boolean result) { 
      pDialog.cancel(); 

     } 
    } 

vous n'avez pas besoin de créer une autre classe java pour faire une AsyncTask vous pouvez le faire dans votre activité de connexion et il suffit d'appeler comme ceci:

new BackGround().execute();