2011-02-04 59 views
0

我的程序运行正常,但在程序运行过程中,用户单击BACK按钮,后退按钮的功能不起作用。但是在完成执行后,BACK按钮功能正在工作。在运行我的程序时,后退按钮功能不能工作(Android)

请在这里观察我的代码。

package com.sampleexample; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class SampleExample extends Activity { 
    static final int PROGRESS_DIALOG = 0; 
    Button button; 
    TextView download; 
    ProgressThread progressThread; 
    ProgressDialog progressDialog; 

    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Log.d("SampleExample", "======= onCreate()====Start===="); 
     // Setup the button that starts the progress dialog 
     download = (TextView) findViewById(R.id.download); 
     button = (Button) findViewById(R.id.progressDialog); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Log.d("SampleExample", "======= onClick()==Start======"); 
       showDialog(PROGRESS_DIALOG); 
       Log.d("SampleExample", "======= onClick()===End====="); 
      } 
     }); 
     Log.d("SampleExample", "======= onCreate()====End===="); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // Handle the back button 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      // Ask the user if they want to quit 
      Log.d("SampleExample", " ------- Back Button onKeyDown()----Start--"); 
      new AlertDialog.Builder(this).setIcon(
        android.R.drawable.ic_dialog_alert).setTitle("Exit") 
        .setMessage("Are you sure you want to leave?") 
        .setNegativeButton(android.R.string.cancel, null) 
        .setPositiveButton(android.R.string.ok, 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int which) { 
            // Exit the activity 
            SampleExample.this.finish(); 
           } 
          }).show(); 

      // Say that we've consumed the event 
      Log.d("SampleExample", " ------BackButton-onKeyDown()----End--"); 
      return true; 
     } 

     return super.onKeyDown(keyCode, event); 
    } 

    // Toast.makeText(SampleExample.this, "U have pressed the Back Button", 
    // Toast.LENGTH_SHORT).show(); 

    // Log.d(this.getClass().getName(), 
    // "*********back button pressed----------"); 

    protected Dialog onCreateDialog(int id) { 
     Log.d("SampleExample", "99999 onCreateDialog() 999 Start"); 
     switch (id) { 
     case PROGRESS_DIALOG: 
      progressDialog = new ProgressDialog(SampleExample.this); 
      progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      progressDialog.setMessage("Loading..."); 
      download.setText("Now downloading......."); 
      progressThread = new ProgressThread(handler); 
      progressThread.start(); 
      return progressDialog; 
     default: 
      return null; 
     } 
    } 

    // Define the Handler that receives messages from the thread and update the 
    // progress 
    final Handler handler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.d("SampleExample", "8888 handleMessage() 8888 Start"); 
      int total = msg.getData().getInt("total"); 
      progressDialog.setProgress(total); 
      if (total >= 100) { 
       // Toast.makeText(SampleExample.this, "Download is completed", 
       // Toast.LENGTH_SHORT).show(); 
       download.setText(" download is completed."); 
       dismissDialog(PROGRESS_DIALOG); 
       progressThread.setState(ProgressThread.STATE_DONE); 
      } 
     } 
    }; 

    /** Nested class that performs progress calculations (counting) */ 
    private class ProgressThread extends Thread { 
     Handler mHandler; 
     final static int STATE_DONE = 0; 
     final static int STATE_RUNNING = 1; 
     int mState; 
     int total; 

     ProgressThread(Handler h) { 
      mHandler = h; 
     } 

     public void run() { 
      mState = STATE_RUNNING; 
      total = 0; 
      Log.d("SampleExample", "7777 run() 7777 Start"); 
      while (mState == STATE_RUNNING) { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        Log.e("ERROR", "Thread Interrupted"); 
       } 
       Message msg = mHandler.obtainMessage(); 
       Bundle b = new Bundle(); 
       b.putInt("total", total); 
       msg.setData(b); 
       mHandler.sendMessage(msg); 

       total++; 
      } 
      Log.d("SampleExample", "6666 run() 6666 End"); 
     } 

     /* 
     * sets the current state for the thread, used to stop the thread 
     */ 
     public void setState(int state) { 
      mState = state; 
     } 
    } 
} 
+1

平滑下来你问的问题。它的痛苦阅读此代码 – Javanator 2011-02-04 07:52:10

回答

1

你还没有真正解释你的问题的症状很明显,但是从你的代码看起来你踢的后台线程,并弹出一个ProgressDialog。我假设它正在运行,您正试图按BACK键。这似乎没有做任何事情的原因是Dialog默认情况下不能使用BACK键取消。您必须致电setCancelable(true)才能启用此行为。

case PROGRESS_DIALOG: 
     progressDialog = new ProgressDialog(SampleExample.this); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setCancelable(true); 
     ... 
     return progressDialog; 

这将允许ProgressDialog被BACK按钮取消。但是,即使Dialog已被取消,您的背景Thread仍将继续运行。

0

chandu你有没有张贴问题

重新检查下面的代码在你的处理器

if (total >= 100) { 

    download.setText(" download is completed."); 
    dismissDialog(PROGRESS_DIALOG); 
    progressThread.setState(ProgressThread.STATE_DONE); 
} 

您的代码将无法达到dismissDialog直到总> = 100 &因此,即使同时该程序前检查你的逻辑您无法useyour返回的行动

&也请停止发布multiple questions

1
// handle phone back button 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) {  
      return quitWithPID(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

// reusable method (modifier may be public..) 
private boolean quitWithPID() { 
    new AlertDialog.Builder(this).setIcon(
      android.R.drawable.ic_dialog_alert).setTitle("Exit Boot Options?") 
      .setMessage("Are you sure you want to exit?") 
      .setNegativeButton(android.R.string.cancel, null) 
      .setPositiveButton(android.R.string.ok, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          // Exit the activity 
          MainActivity.this.finish(); 
          // Terminate the process ;) 
          android.os.Process.killProcess(android.os.Process.myPid()); 
         } 
        }).show();   
    return true; 
}