首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Adapterview类中的Asynctask

Adapterview类中的Asynctask
EN

Stack Overflow用户
提问于 2013-06-01 02:50:01
回答 4查看 1.5K关注 0票数 0

我正在尝试更改列表视图项目的字体。如果没有AsyncTasc,它将花费太多时间。在该列表视图中使用AsyncTask活动很快就会出现,然后在实例应用程序崩溃之后。我知道我无法从AsyncTasc directly.What更改UI我可以使用吗?提前感谢

代码语言:javascript
运行
复制
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;
    }
}

日志

代码语言:javascript
运行
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-01 02:54:25

你可以在AsyncTask中更新UI,而不是从doInBackground()。但任何其他方法都可以。由于它是Adapter类的内部类,其中包含对Context的引用,因此这样做很好。只需将使用Context或需要更新UI的代码移动到任何其他方法即可。

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

onPostExecute

onProogressUpdate

所以我也有很多很好的例子来使用

票数 1
EN

Stack Overflow用户

发布于 2013-06-01 03:06:28

AsyncTask允许您启动一个长进程,并通过UIThread方法访问UI:

  • onPreExecute():用于在治疗开始之前更新UI ( doInBackground)
  • onProgressUpdate():中用于在treatment
  • onPostExecute():期间刷新UI的线程用于在结束过程中更新UI。

如果您了解异步任务的操作,您就有了所需的所有操作

票数 0
EN

Stack Overflow用户

发布于 2013-06-01 03:10:52

您不能在后台线程上更新ui。在后台线程上调用doInBackground。您应该在UI线程上更新ui。

您正在尝试更新doInBackground中的文本视图。如果需要在doInBackground()中更新ui,请使用runOnUiThread。

我也不确定为什么你需要一个异步任务来完成你正在做的事情。

代码语言:javascript
运行
复制
      runOnUiThread(new Runnable(){

          @Override
          public void run(){
            //update ui here
          }
       });

在UI线程上调用onPreExecute()、onPostExecute(Result)。所以你可以在这里更新ui。

onProgressUpdate(进度...),在调用publishProgress(进度...)之后在UI线程上调用。可用于在文本字段中动态显示进度条或显示日志。

doInbackground()计算的结果是onPostExecute( result )的一个参数,因此在doinBackground()中返回结果,并在onPostExecute( result )中显示您的吐司

为清楚起见,请查看主题the 4 steps下的以下链接。

http://developer.android.com/reference/android/os/AsyncTask.html

您也可以使用处理程序来实现此目的。

http://developer.android.com/reference/android/os/Handler.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16863915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档