2016-11-08 135 views
4

我编辑我的代码,根据亲爱的Mayank'answer,但它不显示任何消息,在方法开始之前显示在displayMsg()方法输入..我应该说MethodTest()是以nfc和方法onNewIntent(意向意图)进度对话框不显示在屏幕上

@Override 
protected void onNewIntent(Intent intent) { 
    MethodTest(); 
    .............. 

} 

public void MethodTest() { 
    DisplayMsg("method 1 is running"); 
    Method1(); 

    DisplayMsg("method 2 is running"); 
    Method2(); 

    DisplayMsg("method 3 is running"); 
    Method3(); 

} 

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.doInBackground(totalMsg); 
} 

private class DisplayMsgClass extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     textView.setText("Hello !!!"); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     progressBar.setVisibility(View.VISIBLE); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 

    } 

    @Override 
    protected String doInBackground(String... Messages) { 


     return Messages[0]; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progressBar.setVisibility(View.INVISIBLE); 

     textView.setText(result); 
    } 
} 
在我的布局

<LinearLayout> 
<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:visibility="gone" 
    android:id="@+id/progressBar1" 
    /> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/textv1" 
    android:hint="AppletPass" 
    android:gravity="center"/> 
</LinearLayout> 
+3

你是什么意思'int value = obj.doInBackground(msg);'?请参阅[AsyncTask](https://developer.android.com/reference/android/os/AsyncTask.html)以获取正确的AsyncTask实现 –

+0

这并不重要,我把它放在确保DisplayMsg被执行并创建一个时间可以看到对话框 – Fatemeh

+5

好吧,使用'obj.execute(“”);'而不是'int value = obj.doInBackground(msg);'并检查'ProgressDialog'是否显示 –

回答

3

记住AsyncTasks应该理想地用于短操作(几秒钟之最。 )

尝试了解有关AsyncTask的更多信息,并且您的许多错误代码

  1. 请勿手动拨打doInBackground()

    dc.doInBackground(totalMsg); //错误

  2. DisplayMsg()调用多次,类DisplayMsgClass的新实例创建

    DisplayMsgClass dc = new DisplayMsgClass(); //错误

  3. onPreExecute()
    textView.setText("Hello !!!"); // NullPointerException异常各一次。在不初始化的情况下调用textView.setText()

注意

不要打电话超过一个AsyncTask.execute()更上了一个相同的intance。
对于如:

DisplayMsgClass displayMsgClass = new DisplayMsgClass(); 
displayMsgClass.execute(); 
displayMsgClass.execute(); //Error, IllegalStateException 

会告诉你根据你实现一个基本的演示,你可以根据你自己的方式简单地修改它。

public void MethodTest() { 

    // execute task 
    new DisplayMsgClass().execute("Download now"); 
} 

/* 
public void MethodTest() { 
    DisplayMsg("method 1 is running"); 
    Method1(); 

    DisplayMsg("method 2 is running"); 
    Method2(); 

    DisplayMsg("method 3 is running"); 
    Method3(); 

} 

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.doInBackground(totalMsg); 
} 
*/ 

private class DisplayMsgClass extends AsyncTask<String, Integer, String> { 

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

     // retrieve the widgets 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     textView = (TextView) findViewById(R.id.textv1); 


     textView.setText("Download initialized"); 
     progressBar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected String doInBackground(String... Messages) { 

     // read commands 
     String command = Messages[0]; 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return "Download completed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 

     //invoked on the UI thread after the background computation finishes 
     progressBar.setVisibility(View.INVISIBLE); 
     textView.setText(result); 
    } 
} 
2

为什么你看到onProgressUpdate(Progress...)称为在IF(...)是最终的原因是因为publishProgress(Progress... values)发布消息到内部处理程序,这个内部处理程序稍后处理该消息更新进度。换句话说,publishProgress(Progress... values)不同步调用onProgressUpdate(Progress...) SEE实施这里:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L649

这是必要的,因为publishProgress(Progress... values)预计从doInBackground(Params...)调用,这是工作线程一个的AsyncTask上,而onProgressUpdate(Progress...)发生在UI线程所以UI可以反映进度变化。通过在UI线程上向消息处理器发布消息,可以将进度信息从工作线程同步到UI线程,而不会阻塞任何线程。

+0

谢谢你回答我。 wxcuse我我不明白。我应该在doInBackground(Params ...)中调用onProgressUpdate(Progress ...),而不是publishProgress(Progress ... values)?你可以给我代码更改吗? – Fatemeh

+0

我不清楚为什么你选择使用AsyncTask:AsyncTask是设计用于在工作线程上运行的昂贵的后台任务,以使UI线程免于执行可能导致丢帧的耗时的任务。 MethodTest()是否应该在UI线程或后台线程上运行? –

+1

我使用nfc。它调用新的意图方法,并在此方法中调用方法测试。我找不到任何解决方案并使用异步任务。如果你有我的问题的解决方案,请给我。我只想在调用方法之前显示消息 – Fatemeh

0

创建XML布局进度栏,并设置其知名度默认了,并创建代码示例

//的AsyncTask。

private class DownloadWebPageTask extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     //textView.setText("Hello !!!"); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     progressBar.setVisibility(View.VISIBLE); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 

    } 

    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(new InputStreamReader(
         content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progressBar.setVisibility(View.INVISIBLE); 
     textView.setText(result); 
    } 
} 
+0

谢谢你回答我。不好意思,什么是textview?为什么使用?我编辑了我的代码,包括您的帖子。但不会再显示任何消息 – Fatemeh

+0

它的一个例子,所以基本上在这个例子中,我们从服务器(在json中)获取数据并将其显示到Textview中。 你必须根据你的要求修改它 –

+0

我编辑了我的代码。我把文本视图,我把我编辑的代码再次质疑。在调用dc.doInBackground(totalMsg)后;在displaymsg()方法中。只有doInBackground被调用并返回,没有文字视图中显示。我不应该在doInBackground方法中调用publishProgress? – Fatemeh

1

试试下面的代码

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.runner.execute(totalMsg); 
} 

希望它会工作

:)GlbMP

+0

对不起,但在直流亚军是不明确的。我写了dc.onPostExecute(totalMsg);但是当textv.setText(result);在方法onPostExecute(字符串结果)中执行textview内容没有改变:(为什么需要进度条?它是做什么的? – Fatemeh