[英]How to Set textview in doINBackground android
我想訪問一個postgresql數據庫,但是AsyncTask
和doInBackground
命令有問題。 我不知道為什么不能在onPostExecute
更新textview。 誰能解釋我的問題是什么? 這是我的代碼:
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);
}
}
}
要在doInBackground中設置文本,您可以使用它。
runOnUiThread(new Runnable() {
@Override
public void run() {
txtView.setText("Message");
}
});
嘗試這個:
您可以使用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);
}
}
像這樣設置名字和姓氏
將結果或對象從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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.