2014-12-29 8 views
0

Я сделал приложение, которое может загрузить некоторые данные в мою базу данных. В Activity, в которой пользователь вводит данные для загрузки, я создал ProgressDialog. ProgressDialog создается внутри метода onClick().ProgressDialog не начал работу в основной теме

Теоретически, он будет создан, потому что я не пытаюсь сделать ProgerssDialog в потоке, отличном от Main UI Thread. Тем не менее, это не отображается. Я не знаю почему.

package com.example.demoapp; 

import android.widget.*; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener{ 

private EditText planID, name, number, address, handsetValue, planAmount, validity, pass, confirm_pass; 
private Button call; 
private SharedPreferences prefs; 
private SharedPreferences.Editor editor; 
private String response; 


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

    prefs = getSharedPreferences("PREF", MODE_PRIVATE); 

    boolean startup = prefs.getBoolean("FIRST_STARTUP", true); 
    if(startup) 
    { 
    planID = (EditText) findViewById(R.id.planIDET); 
    name = (EditText) findViewById(R.id.nameET); 
    number = (EditText) findViewById(R.id.contactET); 
    address = (EditText) findViewById(R.id.addressET); 
    handsetValue = (EditText) findViewById(R.id.handsetValueET); 
    planAmount = (EditText) findViewById(R.id.planAmountET); 
    validity = (EditText) findViewById(R.id.validityET); 
    pass = (EditText) findViewById(R.id.editText1); 
    confirm_pass = (EditText) findViewById(R.id.editText2); 

    call = (Button) findViewById(R.id.submit_Button); 

    planID.setText(""); 
    name.setText(""); 
    number.setText(""); 
    address.setText(""); 
    handsetValue.setText(""); 
    planAmount.setText(""); 
    validity.setText(""); 
    pass.setText(""); 
    confirm_pass.setText(""); 


    call.setOnClickListener(this); 
    } 

    else 
    { 
     Intent intent = new Intent(this, LoginActivity.class); 
     startActivity(intent); 
     finish(); 
    } 


} 


@Override 
public void onClick(View v) { 

    if(pass.getText().toString().equals(confirm_pass.getText().toString())) 
    { 
     ProgressDialog progress = ProgressDialog.show(v.getContext(), "Please wait...", "Connecting to server", true, true); 

     String query = "INSERT INTO user_info (name, password, address, plan_id, contact, handset_value, plan_amount, validity) " 
      + "VALUES('" + name.getText() + "','"+ pass.getText() +"','" + address.getText() + "','" + planID.getText() + "','" + number.getText() + "','" + handsetValue.getText() + "','" + planAmount.getText() + "','" + validity.getText() + "');"; 


    ConnectDBThread connect = new ConnectDBThread(query, Resources.INSERT); 
    Thread t1 = new Thread(connect); 
    t1.start(); 
    //####################################// 
    Log.i("onClick() ThreadName",String.valueOf(Thread.currentThread().getId())); 

    while(true) 
    { 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) 
     {e.printStackTrace();} 



     if(Resources.serverResponse!=null) 
     { 
      Toast.makeText(this, "Registered Successfully", Toast.LENGTH_LONG).show(); 
      Log.i("SERVER", Resources.serverResponse); 
      prefs = getSharedPreferences("PREF", MODE_PRIVATE); 
      editor = prefs.edit(); 
      editor.putBoolean("FIRST_STARTUP", false); 
      editor.putString("USERNAME", name.getText().toString()); 
      editor.putString("USERPASS", pass.getText().toString()); 
      editor.commit(); 

      //--- PROGRESSBAR STOPPED 
      progress.dismiss(); 

      break; 

     } 

    }//LOOP 
    } 

    else 
     Toast.makeText(this, "Password mismatch!", Toast.LENGTH_LONG).show(); 

}// onClick() 


} 

Здесь ConnectDBThread является реализацией Runnable интерфейс, который подключается к серверу и отправляет запрос вместе с данными.

Если я создал ProgressDialog вне инструкции If в onClick(), приложение сначала выполнит запрос. После завершения запроса он показывает ProgressDialog.

Пожалуйста, помогите мне. Спасибо.

+0

вы сделали необходимые проверки, если кнопка идентификатор одного нажатия кнопки мыши, что R.id.submit_Button? Выполняется ли Thread? Правильно ли это проход, так что введено? – mobilepotato7

+0

Да. Все работает нормально. Данные надежно загружаются в базу данных. Но ProgressDialog не отображается. – user3756173

+0

попробуйте отладить его, потому что я проверил код, и я попытался создать диалог прогресса в onClick так же, как и вы, и его работу в моем коде. –

ответ

0

Я думаю, что проблема связана с контекстом ProgressDialog. С точки зрения дизайна я считаю, что лучше объявить ProgressDialog как переменную экземпляра.

public class YourClass{ 

    private ProgressDialog progressDialog; // instance variable 
    .... 
} 

А потом в методе клик создать его так:

// I believe the main issue is with the context you bind to the progressDialog 
// provide the activity as context as an Activity extends Context 
progressDialog= ProgressDialog.show(this, "Please wait...", "Connecting to server", true, true); 

И, наконец, не поставить время цикла, как, что внутри метода OnClick. Это приведет к тому, что кнопка будет липкой, что нежелательно, а также сделает пользовательский интерфейс невосприимчивым. Сделайте свой ConnectDBThread AsyncTask и обновите пользовательский интерфейс (например, откройте диалоговое окно) от 0 до onPostExecute после того, как фоновый процесс завершен в doInBackground.

Вот предложенное решение:

public class InsertTask extends AsyncTask<String, Void, String> { 

    ProgressDialog dialog; 
    Context ctx; 

    public InsertTask(Context ctx){ 
     this.ctx = ctx; 
    } 

    protected void onPreExecute(Void result) { 
     // do UI work here 
     dialog = ProgressDialog.show(ctx, "Please wait...", "Connecting to server", true, true); 

    } 

    protected Void doInBackground(String... args) { 


     // do insert operation here ... 
     String username = args[0]; 
     String password = args[1]; 

     ......  
     String query = .... // generate the query 
     String serverResponse = doDBInsert(query); // create a method to run the query and return response 

     return serverResponse; 
    } 

    protected void onPostExecute(String result) { 
     // do UI work here 
     // display your serverResponse(result) somewhere if needed 
     if(dialog!=null && dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
    } 
} 

Внутри OnClick Метод:

//If check condition is met (password = confirm password) 
new InsertTask(getApplicationContext()).execute(username, password, address ...); 
+0

Выполнение этой переменной экземпляра не работает. – user3756173

+0

Я создал ProgressDialog перед оператором If, и он работает. Как? – user3756173

+0

Я считаю, что проблема заключается в вашем цикле while внутри кода. Вам нужно будет использовать AsyncTask, чтобы он работал. Дизайн, который вы используете для выполнения работы, неверен. – ZakiMak

Смежные вопросы