2016-11-11 55 views
0

我想访问postgresql数据库,但我遇到了AsyncTaskdoInBackground命令的问题。我不知道为什么我不能在onPostExecute更新我的textview。任何人都可以解释我有什么问题吗?这里是我的代码:如何在doINBackground中设置textview android

package com.example.armyhealthcare; 

import java.sql.*; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.*; 


public class MainActivity extends Activity { 
    private static final String url = "jdbc:postgresql://elmer-02.db.elephantsql.com.5432/xyz"; 
    private static final String user = "user"; 
    private static final String pass = "pass"; 
    private TextView firstname, lastname; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     firstname = (TextView) findViewById(R.id.textfname); 
     lastname = (TextView) findViewById(R.id.textlname); 
     Button buttonload = (Button) findViewById(R.id.buttonload); 

     buttonload.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       new mytask().execute(); 

      } 
     }); 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


    private class mytask extends AsyncTask<Void, Void, Void>{ 
     private String finame=""; 
     private String laname=""; 
     @Override 
     protected Void doInBackground(Void... arg0){ 

      try{ 
       Class.forName("org.postgresql.Driver"); 
       Connection con = DriverManager.getConnection(url, user, pass); 

        Statement st = con.createStatement();     
        final ResultSet rs = st.executeQuery("select * from book"); 
        rs.next(); 
        finame= rs.getString(1); 
        laname= "Show Me"; 

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

      } 
      return null; 

     } 

     @Override 
     protected void onPostExecute(Void result){ 
      firstname.setText("finame"); 
      lastname.setText(laname); 
      super.onPostExecute(result); 
     } 

    } 

} 
+0

会发生什么?你有任何错误? –

+0

你的错误是什么或你得到了什么回应 – Raju

+0

@AhmadAlsanie你为什么认为这是对这个问题的重复? –

回答

0

您可以使用runOnUiThead()或设置文本onPostExexute()

例子:

runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          tvText.setText("ABC"); 
         } 
        }); 

编辑: 好方法:

private class mytask extends AsyncTask<Void, Void, Void> { 
     private String finame=""; 
     private String laname=""; 
     @Override 
     protected Void doInBackground(Void... arg0){ 

      try{ 
       Class.forName("org.postgresql.Driver"); 
       Connection con = DriverManager.getConnection(url, user, pass); 

       Statement st = con.createStatement(); 
       final ResultSet rs = st.executeQuery("select * from book"); 
       rs.next(); 
       finame= rs.getString(1); 
       laname= "Show Me"; 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 

      } 
      return null; 

     } 

     @Override 
     protected void onPostExecute(Void result){ 
      super.onPostExecute(result); 
      firstname.setText(finame); 
      lastname.setText(laname); 
     } 

    } 

糟糕的方式:

private class mytask extends AsyncTask<Void, Void, Void> { 
     private String finame=""; 
     private String laname=""; 
     @Override 
     protected Void doInBackground(Void... arg0){ 

      try{ 
       Class.forName("org.postgresql.Driver"); 
       Connection con = DriverManager.getConnection(url, user, pass); 

       Statement st = con.createStatement(); 
       final ResultSet rs = st.executeQuery("select * from book"); 
       rs.next(); 
       finame= rs.getString(1); 
       laname= "Show Me"; 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         firstname.setText(finame); 
         lastname.setText(laname); 
        } 
       }); 

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

      } 
      return null; 

     } 

     @Override 
     protected void onPostExecute(Void result){ 
      super.onPostExecute(result); 
     } 

    } 

设置姓氏和名字像这样

+0

'onPostExecute'在UI线程上被调用。 –

+0

感谢您的帮助,但没有奏效。我发现了这个问题。我不能从“尝试”里面传递字符串。它让我困惑.. – Rasa

+0

你想在textview中设置什么?你的代码的名字和姓氏? – SANAT

2

要在doInBackground设置文本,你可以用这个。

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        txtView.setText("Message");  
       } 
      }); 

试试这个:

Updating TextView from Async Task which use custom program dialog

+0

感谢您的帮助,但没有奏效。我发现了这个问题。我不能从“尝试”里面传递字符串。它使我困惑.. – Rasa

+0

这个答案显然是错误的,应该没有收到任何upvotes。未来的读者会误导。 'onPostExecute'已经在UI-Thread上运行。 –

0

结果传递或对象从String doInBackground()onPostExecute(String result)

请效仿的榜样。

doInBackground()方法:

protected String doInBackground(Void... arg0){ 

     //Your code here 
     return rs.getString(1);; 
} 

onPostExecute()方法:

@Override 
protected void onPostExecute(String result){ 
    super.onPostExecute(result); 
    firstname.setText(result); 
    lastname.setText("Show Me"); 

} 
+0

感谢您的帮助,但没有奏效。我发现了这个问题。我不能从“尝试”里面传递字符串。它令我困惑。 – Rasa

相关问题