2013-06-27 99 views
0

我的android应用程序设置为当从服务器接收到通知时从服务器获取数据。此通知包含用于查询服务器和下载数据的ID。然而问题是,如果用户在数据下载之前点击通知,则会出现空指针异常。从服务器下载数据时加载/监听器屏幕

我正在寻找用户友好的方式来管理这个,理想的情况下,如果用户在数据下载之前点击这个,那么一个加载符号会出现,直到它被下载。

我没有这样做的具体想法,有没有关于这个问题的任何教程/示例代码?我想我需要使用一个监听器?

谢谢!

+0

尝试实施自定义听众 –

回答

1

这是一种方式:

public void showProgressDialog() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        mProgressDialog = onCreateProgressDialog(); 
        mProgressDialog.show(); 
       } 
      }); 

} 

private ProgressDialog onCreateProgressDialog() { 
    ProgressDialog dialog = new ProgressDialog(RequesterActivity.this); 
    dialog.setTitle(getString(R.string.label_dialog_item_to_find) +" "+ 
      ((EditText) findViewById(R.id.edit_text_item_id)).getText().toString()); 
    dialog.setMessage(getString(R.string.label_dialog_finding_item)); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(false); 
    return dialog; 
} 

请注意,你可以给一个“没有风格”的对话也喜欢在这里Dialog with transparent background in Android或这里android dialog transparent取决于你所需要的东西。

另一方面,我使用ProgressDialog,其中有一些信息,如"Please wait while loading item..."。从服务器获取数据后,只需调用cancel()方法即可显示ProgressDialog(此ProgressDialog应该在实例变量中创建,因此您可以跟踪它并可以从各处调用cancel()),然后显示您将显示的任何内容您现在拥有的数据。另外,由于您的下载是后台进程,因此您可以使用观察者模式(侦听程序模式),其中您的活动将实现一个让我们假设的接口,其中AsyncTask是您的下载后台进程的类名称,这个接口应该有Activity在后台进程中调用的方法,比如这样的方法将在AsyncTask类的中调用,最后一件事是创建一个实例变量(成员) AsyncTask类中的接口,也可能由ConstructorSetter方法设置接口。 下面是一个例子:

接口:

public interface MessageHandlerListener { 
public void toastMessage(int messageId); 
} 

活动:

public class AnyActivityThatNeedsToShowAMessageInABackgroundProcessOrInUIThread extends Activity implements MessageHandlerListener { 
    public void toastMessage(int messageId){ 
     //show a toast implementation 
} 
} 

的AsyncTask:

public class BackgroundProcess extends AsyncTask { 
    MessageHandlerListener mMessageHandlerListener; 

public BackgroundProcess(MessageHandlerListener m){ 
    mMessageHandlerListener = m; 
} 

protected Object doInBackground(Object[] objects){ 
    return null 
} 

protected void onPostExecute(Object o) { 
    mMessageHandlerListener.toastMessage(Message.CONSTANT_MESSAGE); 
} 
} 

这是一种更好的形式给出,让您应用MVC模式在你的后台进程可能是控制器的Android中,你的活动是视图并根据项目的需要有一个好的模型。问候。

+0

您的英语很棒!非常感谢你:) – User24231

+0

不客气,并检查代码我修改了一些不正确的东西:) – JosephChilberry