Android Adapterview类中的Asynctask

Android Adapterview类中的Asynctask,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我正在尝试更改listview项目的字体。如果没有AsyncTasc,则需要花费太多时间。将AsyncTask活动与该listview一起使用会在实例应用程序崩溃后快速出现。我知道我不能直接从AsyncTasc更改UI。我可以使用什么?提前谢谢 import ru.ayratbadykov.feedhandler.FEED; import ru.ayratbadykov.feedhandler.RssMessage; import android.content.Context; import

我正在尝试更改listview项目的字体。如果没有AsyncTasc,则需要花费太多时间。将AsyncTask活动与该listview一起使用会在实例应用程序崩溃后快速出现。我知道我不能直接从AsyncTasc更改UI。我可以使用什么?提前谢谢

import ru.ayratbadykov.feedhandler.FEED;
import ru.ayratbadykov.feedhandler.RssMessage;
import android.content.Context;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter {
    private FEED _data;
    Context _c;

    CustomAdapter(FEED data, Context c) {
        _data = data;
        _c = c;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.w("here","here");
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) _c
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.customadapter, null);
        }

        TextView fromView = (TextView) v.findViewById(R.id.textView1);
        TextView subView = (TextView) v.findViewById(R.id.textView2);
        TextView View = (TextView) v.findViewById(R.id.textView3);

        RssMessage msg = _data.getMessages().get(position);
        new Font().execute(fromView,subView,View);





        fromView.setText(msg.getTitle());
        subView.setText(msg.getPUBDATE());
        View.setText(_data.getTitle());

        return v;
    }
    public class Font extends AsyncTask<TextView, Void, Boolean> {

        @Override
        protected Boolean doInBackground(TextView... params) {
            // TODO Auto-generated method stub
            String fontPath = "fonts/Qlassik_TB.ttf";
            Typeface tf = Typeface.createFromAsset(_c.getAssets(), fontPath);
            params[0].setTypeface(tf);
            fontPath="fonts/damase.ttf";

            tf = Typeface.createFromAsset(_c.getAssets(), fontPath);
            params[1].setTypeface(tf);

            tf = Typeface.createFromAsset(_c.getAssets(), fontPath);
            params[3].setTypeface(tf);
            return true;

        }

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return _data.getMessages().size();

    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return _data.getMessages().get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
}
导入ru.ayratbadykov.feedhandler.FEED;
导入ru.ayratbadykov.feedhandler.RssMessage;
导入android.content.Context;
导入android.graphics.Typeface;
导入android.os.AsyncTask;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.TextView;
公共类CustomAdapter扩展了BaseAdapter{
私有FEED_数据;
语境;
CustomAdapter(提要数据,上下文c){
_数据=数据;
_c=c;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
Log.w(“此处”、“此处”);
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)\u c
.getSystemService(上下文布局\充气机\服务);
v=vi.充气(R.layout.customadapter,空);
}
TextView fromView=(TextView)v.findViewById(R.id.textView1);
TextView子视图=(TextView)v.findViewById(R.id.textView2);
TextView=(TextView)v.findViewById(R.id.textView3);
RssMessage msg=_data.getMessages().get(位置);
新建字体().execute(从视图、子视图、视图);
fromView.setText(msg.getTitle());
setText(msg.getPUBDATE());
View.setText(_data.getTitle());
返回v;
}
公共类字体扩展异步任务{
@凌驾
受保护的布尔doInBackground(TextView…参数){
//TODO自动生成的方法存根
字符串fontPath=“font/Qlassik_TB.ttf”;
Typeface tf=Typeface.createFromAsset(_c.getAssets(),fontPath);
参数[0]。设置字体(tf);
fontPath=“font/damase.ttf”;
tf=Typeface.createFromAsset(_c.getAssets(),fontPath);
参数[1]。设置字体(tf);
tf=Typeface.createFromAsset(_c.getAssets(),fontPath);
参数[3]。设置字体(tf);
返回true;
}
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回_data.getMessages().size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回_data.getMessages().get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
}
日志

05-31 22:32:27.602:E/AndroidRuntime(2803):致命异常:AsyncTask#1
05-31 22:32:27.602:E/AndroidRuntime(2803):java.lang.RuntimeException:执行doInBackground()时出错
05-31 22:32:27.602:E/AndroidRuntime(2803):在android.os.AsyncTask$3.done(AsyncTask.java:200)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.util.concurrent.FutureTask.setException(FutureTask.java:125)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-31 22:32:27.602:E/AndroidRuntime(2803):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-31 22:32:27.602:E/AndroidRuntime(2803):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.lang.Thread.run(Thread.java:1019)
05-31 22:32:27.602:E/AndroidRuntime(2803):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-31 22:32:27.602:E/AndroidRuntime(2803):位于android.os.Handler.(Handler.java:121)
05-31 22:32:27.602:E/AndroidRuntime(2803):在ru.ayratbadykov.rssunion.CustomAdapter$Font$1.(CustomAdapter.java:63)
05-31 22:32:27.602:E/AndroidRuntime(2803):在ru.ayratbadykov.rssunion.CustomAdapter$Font.doInBackground(CustomAdapter.java:63)
05-31 22:32:27.602:E/AndroidRuntime(2803):在ru.ayratbadykov.rssunion.CustomAdapter$Font.doInBackground(CustomAdapter.java:1)
05-31 22:32:27.602:E/AndroidRuntime(2803):在android.os.AsyncTask$2.call(AsyncTask.java:185)
05-31 22:32:27.602:E/AndroidRuntime(2803):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-31 22:32:27.602:E/AndroidRuntime(2803):。。。4更多

您可以在
AsyncTask
中更新
UI
,而不是从
doInBackground()
进行更新。但任何其他方法都可以。由于它是
适配器
类的一个内部类,包含对
上下文
的引用,因此可以这样做。只需将使用
Context
或需要更新
UI
的代码移动到任何其他方法

例如,您可以将
params
ArrayList
返回到
onPostExecute()
并在那里进行更新,也可以使用
publishProgress()
onProgressUpdate()中进行更新


因此也有很多很好的例子说明如何使用每种方法。AsyncTask允许您启动一个长流程,并通过UIThread方法访问UI:

  • onPreExecute():在开始治疗前更新UI(doInBackground中的线程)
  • onProgressUpdate():在治疗期间刷新UI
  • onPostExecute():在进程结束时更新UI
你拥有一切
05-31 22:32:27.602: E/AndroidRuntime(2803): FATAL EXCEPTION: AsyncTask #1
    05-31 22:32:27.602: E/AndroidRuntime(2803): java.lang.RuntimeException: An error occured while executing doInBackground()
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.lang.Thread.run(Thread.java:1019)
    05-31 22:32:27.602: E/AndroidRuntime(2803): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at android.os.Handler.<init>(Handler.java:121)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at ru.ayratbadykov.rssunion.CustomAdapter$Font$1.<init>(CustomAdapter.java:63)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at ru.ayratbadykov.rssunion.CustomAdapter$Font.doInBackground(CustomAdapter.java:63)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at ru.ayratbadykov.rssunion.CustomAdapter$Font.doInBackground(CustomAdapter.java:1)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    05-31 22:32:27.602: E/AndroidRuntime(2803):     ... 4 more
      runOnUiThread(new Runnable(){

          @Override
          public void run(){
            //update ui here
          }
       });
public class CustomAdapter extends BaseAdapter {

static Typeface mFont = YourClass.getDefaultTypeFace();

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   ...
   TextView tv;
   ... 
   tv.setTypeface(mFont);
   ...
  }
}